Powershell 文本文件中不应显示的新行
我试图读取一个CSV文件,其中包含用户ID、给定姓名、姓氏和一些用户的性别。脚本应该读取userID,并检查是否已经存在具有此ID的目录,如果不存在,则创建一个。比它应该读出来的,哪个性别的用户。根据这些信息,脚本生成一个文本文件,其中包含一个正确的称呼和一个静态的身体文本,这对于男人和女人都是一样的。这就是我迄今为止所取得的成就:Powershell 文本文件中不应显示的新行,powershell,csv,foreach,Powershell,Csv,Foreach,我试图读取一个CSV文件,其中包含用户ID、给定姓名、姓氏和一些用户的性别。脚本应该读取userID,并检查是否已经存在具有此ID的目录,如果不存在,则创建一个。比它应该读出来的,哪个性别的用户。根据这些信息,脚本生成一个文本文件,其中包含一个正确的称呼和一个静态的身体文本,这对于男人和女人都是一样的。这就是我迄今为止所取得的成就: #变量 $script:pgm=“欢迎” $script:log=“$PSScriptRoot\$pgm.log” $script:csv=“$pgm.csv” $
#变量
$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
可以很好地解决此问题,但仅在控制台中,您无法将其传输到文件中。有没有一种方法可以使用写入输出
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,现在有点挣扎。