我试图读出一个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
}
我有两个挣扎:
- 脚本总是在文本文件中写"Jones"作为名字,而忽略其他两个,并且只写"Dear Mr."(也是针对女性用户)。
- 脚本将名称放在单独的行中。
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
}