Powershell 文本文件中不应显示的新行

Powershell 文本文件中不应显示的新行,powershell,csv,foreach,Powershell,Csv,Foreach,我试图读取一个CSV文件,其中包含用户ID、给定姓名、姓氏和一些用户的性别。脚本应该读取userID,并检查是否已经存在具有此ID的目录,如果不存在,则创建一个。比它应该读出来的,哪个性别的用户。根据这些信息,脚本生成一个文本文件,其中包含一个正确的称呼和一个静态的身体文本,这对于男人和女人都是一样的。这就是我迄今为止所取得的成就: #变量 $script:pgm=“欢迎” $script:log=“$PSScriptRoot\$pgm.log” $script:csv=“$pgm.csv” $

我试图读取一个CSV文件,其中包含用户ID、给定姓名、姓氏和一些用户的性别。脚本应该读取userID,并检查是否已经存在具有此ID的目录,如果不存在,则创建一个。比它应该读出来的,哪个性别的用户。根据这些信息,脚本生成一个文本文件,其中包含一个正确的称呼和一个静态的身体文本,这对于男人和女人都是一样的。这就是我迄今为止所取得的成就:

#变量
$script:pgm=“欢迎”
$script:log=“$PSScriptRoot\$pgm.log”
$script:csv=“$pgm.csv”
$script:dir=“D:\ps\users”
$script:txt=“$pgm.txt”
$script:fix=“$pgm.fix”#fix是带有静态文本的文件
$script:mrs=“亲爱的夫人。”
$script:mr=“亲爱的先生。”
#创建目录和文本文件
$imp=导入csv$csv-分隔符“;”-编码UTF8
$users=$imp[0..2]。用户ID
$sex=$imp[0..2]。sex
$sirname=$imp[0..2]。sirname
$f=类别$fix
foreach(用户数为$a){
if(!(测试路径$dir\$a)){
新项目-路径$dir\$a-项目类型目录
}
}
foreach($d在$sex中){
如果($d-等式“F”){
foreach($sirname中的名称){
写入输出$mrs$name“,”输出文件$dir\$a\$txt
}
}   
否则{
foreach($sirname中的名称){
写入输出$mr$name“,”输出文件$dir\$a\$txt
}   
}
写入输出$f>>$dir\$a\$txt
}   
我有两个挣扎:

  • 脚本总是在文本文件中写“琼斯”作为名字,而忽略其他两个名字,并且只写“亲爱的先生”(也写给女性用户)
  • 脚本将名称放在单独的一行中
    Write Host-NoNewLine
    可以很好地解决此问题,但仅在控制台中,您无法将其传输到文件中。有没有一种方法可以使用
    写入输出
  • 输出文本文件如下所示:

    尊敬的先生:。 琼斯, 欢迎来到我们公司! 你的系统管理员 但它应该是这样的:

    尊敬的琼斯先生:, 欢迎来到我们公司! 你的系统管理员 CSV文件:

    Userid;吉文纳姆;SirName;性
    千斤顶;汤姆;杰克逊;M
    米勒;凯特;米勒;F
    琼斯;保罗;琼斯;M
    

    谢谢你的帮助

    不必过分复杂化

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

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

    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
    

    写入输出只是写入管道。通常,这些对象在写入主机或文件时会变成单独的行。下面的答案显示了您可以使用的更简单的方法,但您最初的问题源于不了解您正在使用的cmdlet的功能。@Joey抱歉,我不熟悉脚本和powershell,还在学习中。感谢这对我的帮助,但我如何将其输出到3个单独的文本文件中,每个文件都位于自己的目录中,这是在他的部分中创建的:
    foreach($users中的a){if(!(testpath$dir\$a)){newitem-Path$dir\$a-ItemType Directory}}
    我认为这不会像编码那样工作,因为如果
    “@
    。将其从循环中取出会更容易,并且可能使用格式化操作符填充here字符串。喜欢你访问标题的方式。你能给我举个例子吗?我不熟悉脚本和powershell,现在有点挣扎。