很抱歉标题不正确,但我很难简洁地描述它。
我写了一个Powershell脚本,它将一封带有特定附件的电子邮件发送到CSV中的用户列表。脚本完成了它应该做的事情。我正在导入一个CSV并将其管道传输到ForEach对象。例如:
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,我会很高兴,但我尝试过的一切都不起作用。
任何帮助都将不胜感激。
我发誓,我现在只在这里发布try/catch响应。
因此,解决这个问题的方法是采取您的流程,添加-ErrorAction STOP
,并将整个代码放在try/catch块中。这将允许我们尝试您的第一个命令,如果我们遇到错误,那么我们将在catch块中运行代码。我们只会在这里放一个更好的写错误消息,给你一些更好的输出。我们还将把有错误的一个存储在一个变量中,我们可以在最后输出。
$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
试试看,让我知道它是如何为你工作的。