对不好的标题感到抱歉,但我很难用简洁的方式来描述它。
我编写了一个Powershell脚本,该脚本向CSV中的用户列表发送带有特定附件的电子邮件。该脚本完成它应该做的事情。我正在导入CSV并将其管道传输到ForEach-Object。例如:
Import-Csv $csvFile | ForEach-Object{Send-MailMessage -To $($_.email) -Attachments $attachPath$($_.attachment) -SmtpServer $mailServer -Credential $credential -UseSsl $subject -Port $mailServerPort -Body "Hello $($_.name),$body" -From $sender -BodyAsHtml }
同样,这可以按预期工作。我遇到的问题是,如果出现错误,我不知道它发生了哪个循环迭代。
我已经想出如何使用以下方法将错误传递给文件:
Import-Csv $csvFile | ForEach-Object{Send-MailMessage -To $($_.email) -Attachments $attachPath$($_.attachment) -SmtpServer $mailServer -Credential $credential -UseSsl $subject -Port $mailServerPort -Body "Hello $($_.name),$body" -From $sender -BodyAsHtml } 2>> error.txt
但是,这并没有给我任何关于它失败的CSV行的具体信息。
根据Microsoft的Send-MailMessage Cmdlet文档,它不提供任何输出。
如果只是将$ _。电子邮件和错误一起打印到error.txt,我会很高兴,但我尝试过的所有东西都不起作用。
任何帮助都会非常感激。
答案 0 :(得分:3)
我发誓,我现在只在这里发布尝试/捕获回复。
所以,解决这个问题的方法是采用你的过程,添加-ErrorAction STOP
并将整个代码放在try / catch块中。这将允许我们尝试你的第一个命令,如果我们遇到错误,那么我们将在catch块中运行一些代码。我们只是在这里添加一个更好的Write-Error消息,以便为您提供更好的输出。而且我们还会在最后输出的变量中存储错误的那个。
$errors = @()
Import-Csv $csvFile | ForEach-Object{
try {Send-MailMessage -To $($_.email) -Attachments $attachPath$($_.attachment) `
-SmtpServer $mailServer -Credential $credential -UseSsl $subject `
-Port $mailServerPort -Body "Hello $($_.name),$body" -From $sender -BodyAsHtml -ErrorAction Stop}
catch {Write-Error "Unable to send e-mail for this object $_.email"
$errors += $_.Email}
}
Write-output "Unable to send e-mails for the following users"
$errors
试一试,让我知道它对你有用。