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

试一试,让我知道它的效果如何。