PowerShell脚本求助:如何在邮件正文中注入CSV员工变量
问题解决:PowerShell邮件脚本变量注入失败
错误原因分析
- 变量初始化时机错误:所有用户相关变量(如
$Emp_First_Name、$ManagerEmail)定义在foreach循环外部,此时$user变量尚未被赋值,无法读取CSV中的员工数据。 - 特殊列名引用问题:CSV中的
employee#列包含特殊字符#,直接用$user.employee无法正确获取值,需要用$user.'employee#'格式引用。 - 邮件内容未动态更新:邮件正文
$Body定义在循环外,不会随每次循环的用户数据变化,导致所有邮件内容相同且无有效变量值。
修正后的PowerShell脚本
$infile = "c:\sdk\import.csv" $userlist = Import-Csv $infile $subject= "New Employee Account" # 配置发件人凭据 $username = "crtusr@fake.ca" $password = "$%t67Bgt##23$%t67Bgt##23hhgfhfghfghgfhgffgfgdhfghfggffgdgfdhgfhfgffsd" $sstr = ConvertTo-SecureString -String $password -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $sstr # 遍历每个用户,动态生成邮件内容并发送 foreach ($user in $userList) { # 读取当前用户的各项数据,注意特殊列名的引用方式 $Emp_First_Name = $user.emp_first_name $Emp_Last_Name = $user.Emp_Last_Name $employeeNumber = $user.'employee#' $upn = $user.upn $ManagerEmail = $user.ManagerEmail # 动态生成邮件正文,使用当前用户的变量 $Body = @" Hello The account for $Emp_First_Name $Emp_Last_Name (employee number $employeeNumber) is ready. Their user email and username is $upn. "@ # 发送邮件,使用当前用户的经理邮箱作为收件人 Send-MailMessage –From crtusr@fake.ca ` –To $ManagerEmail ` –Subject $subject ` –Body $body ` -SmtpServer smtp.office365.com ` -Credential $cred ` -UseSsl ` -Port 587 }
关键修正点
- 将用户变量读取和邮件正文生成逻辑移到
foreach循环内部,确保每次循环都使用当前迭代的用户数据 - 使用
$user.'employee#'正确引用包含特殊字符#的列 - 用Here-String(
@"... "@)定义邮件正文,格式更清晰且避免换行问题 - 调整变量名(如
$employeeNumber)提高可读性,避免与内置名称冲突
内容的提问来源于stack exchange,提问作者lakeek
相关产品推荐
相关产品推荐

