每个迭代的ForEach对象Powershell写入错误



很抱歉标题不正确,但我很难简洁地描述它。

我写了一个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

试试看,让我知道它是如何为你工作的。

最新更新