【问题标题】:ForEach-Object Powershell write error per iteration每次迭代的 ForEach-Object Powershell 写入错误
【发布时间】:2015-04-02 01:24:14
【问题描述】:

抱歉标题不好,但我无法简洁地描述这个。

我编写了一个 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 中的错误,我会很高兴,但我尝试过的一切都不起作用。

任何帮助将不胜感激。

【问题讨论】:

    标签: powershell foreach


    【解决方案1】:

    我发誓,我现在只在这里发布 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
    

    试一试,告诉我它是如何为你工作的。

    【讨论】:

    • 非常感谢。如所写,当没有错误时它运行良好。当我引入错误时(我在其中一个 csv 行上提供了错误的电子邮件地址),我得到:Unable to send e-mail for this object The specified string is not in the form required for an e-mail address..email At line:1 char:1 + C:\ps\key-mail\keys-mail-test.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,keys-mail-test.ps1 无法为以下用户发送电子邮件
    • 酷,总比没有输出好。您可以做的另一件事是修改 $catch 语句并将当前错误消息添加到 $errors。代码如下$errors += $error[0] 同样,您需要注释掉我提供的 Write-Error 行。这些更改将抓取最新的错误并将其收集在 $errors 中。然后,您将能够从 Send-Mailmessage 捕获输出。
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多