ForEach-Object Powershell每次迭代写入错误

时间:2015-04-02 01:24:14

标签: powershell foreach

对不好的标题感到抱歉,但我很难用简洁的方式来描述它。

我编写了一个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,我会很高兴,但我尝试过的所有东西都不起作用。

任何帮助都会非常感激。

1 个答案:

答案 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

试一试,让我知道它对你有用。