当文本文件不应该出现时,新行出现在文本文件中

时间:2015-09-16 08:08:13

标签: powershell csv foreach

我正在尝试读出一个CSV文件,其中包含用户ID,给定名称,姓氏和某些用户的性别。该脚本应该读出userID并检查具有此ID的目录是否已存在,如果没有,则创建一个。比它应该读出,用户具有哪种性别。通过这些信息,脚本会生成一个文本文件,其中包含正确的称呼和静态正文,对于男性和女性来说都是相同的。这是我到目前为止所取得的成就:

#Variables

$script:pgm="welcome"
$script:log="$PSScriptRoot\$pgm.log"        
$script:csv="$pgm.csv"
$script:dir="D:\ps\users"
$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”作为名称写入,忽略其他两个,并且只写“亲爱的先生” (也是女性用户)。
  2. 脚本将名称放在单独的行中。 Write-Host -NoNewLine可以解决此问题,但仅在控制台中,您无法将其传输到文件中。有没有办法用write-output
  3. 来做到这一点

    输出文本文件如下所示:

    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
    

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

无需过于复杂!

$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                  
 }                                                                                             

答案 1 :(得分:1)

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

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