ForEach-Object Powershell 每次迭代写入错误
ForEach-Object Powershell write error per iteration
抱歉标题不好,但我无法简洁地描述它。
我编写了一个 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 文档,它不提供任何输出。
如果它只打印 $_.email 以及 error.txt 的错误,我会很高兴,但我尝试过的所有方法都不起作用。
如有任何帮助,我们将不胜感激。
我发誓,我现在只有 post try/catch 回复。
因此,解决此问题的方法是在您的流程中添加 -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
试一试,让我知道它的效果如何。
抱歉标题不好,但我无法简洁地描述它。
我编写了一个 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 文档,它不提供任何输出。
如果它只打印 $_.email 以及 error.txt 的错误,我会很高兴,但我尝试过的所有方法都不起作用。
如有任何帮助,我们将不胜感激。
我发誓,我现在只有 post try/catch 回复。
因此,解决此问题的方法是在您的流程中添加 -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
试一试,让我知道它的效果如何。