文本文件中出现了不应该出现的新行



我试图读出一个CSV文件,其中包含用户id,给定的名字,姓氏和一些用户的性别。脚本应该读取userID并检查这个ID的目录是否已经存在,如果不存在则创建一个。然后它应该读出用户的性别。有了这些信息,脚本制作一个文本文件,其中包含适当的称呼和静态正文文本,这对男性和女性都是一样的。以下是我到目前为止所完成的:

#Variables
$script:pgm="welcome"
$script:log="$PSScriptRoot$pgm.log"        
$script:csv="$pgm.csv"
$script:dir="D:psusers"
$script:txt="$pgm.txt"
$script:fix="$pgm.fix"    # fix is the file with the static text
$script:mrs="Dear Mrs."
$script:mr="Dear Mr."
# Create directories & textfiles
$imp=import-csv $csv -Delimiter ";" -Encoding UTF8
$users=$imp[0..2].Userid
$sex=$imp[0..2].Sex
$sirname=$imp[0..2].SirName
$f=cat $fix
foreach($a in $users) {
    if(! (Test-Path $dir$a)) {
        New-Item -Path $dir$a -ItemType Directory      
    }
}
foreach($d in $sex) {
    if ($d -eq "F") {
        foreach($name in $sirname) {
            write-output $mrs $name"," | out-file $dir$a$txt 
        }
    }   
    Else {
        foreach($name in $sirname) {
            write-output $mr $name"," | out-file $dir$a$txt
        }   
    }
    write-output $f >> $dir$a$txt
}   

我有两个挣扎:

  1. 脚本总是在文本文件中写"Jones"作为名字,而忽略其他两个,并且只写"Dear Mr."(也是针对女性用户)。
  2. 脚本将名称放在单独的行中。Write-Host -NoNewLine可以很好地解决这个问题,但只能在控制台中,您不能将其管道到文件中。有办法做到这一点与write-output ?

输出文本文件如下所示:

Dear Mr.  
Jones,
welcome to our company!
Your sysadmin

但是它应该是这样的:

Dear Mr. Jones,
welcome to our company!
Your sysadmin

CSV文件

Userid;GivenName;SirName;Sex 
JACKS;Tom;Jackson;M 
MILLE;Kate;Miller;F
JONES;Paul;Jones;M

谢谢你的帮助!

首先,您应该使用匹配的记录作为源,而不是将数据拆分为几个未链接的变量:

foreach($user in $imp) {...}

进入后,可以调用$user.sex等CSV字段来确定用户所需的参数。这将使电子邮件生成代码变成这样:

foreach ($user in $imp) {
    $title=('Mr.','Mrs.')[$user.sex -eq 'F'] # returns 'Mr.' if there's not 'F' in sex
    @"
    Dear $title $($user.surname)!
    Welcome to our company!
    Your sysadmin.
    "@ # a multilined string with placeholders for variables
} # that's all, folks

不必过于复杂!

$csv=Import-Csv users.csv -Delimiter ';' 
$csv |%{                                                                                       
    if ($_.Sex -eq 'M') {$prefix = 'Mr.'}                                                     
    else{$prefix='Mrs.'}                                                                      
    echo "Dear $prefix $($_.SirName)" |out-file -filepath "c:temp$($_.userid)welcome.txt"   
    get-content $fix |out-file "c:temp$($_.userid)welcome.txt" -Append                  
 }                                                                                             

最新更新