首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每次迭代时ForEach-Object Powershell写入错误

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

Stack Overflow用户
提问于 2015-04-02 01:24:14
回答 1查看 2.9K关注 0票数 0

抱歉,标题不好,但我很难用简洁的方式来描述这件事。

我编写了一个Powershell脚本,向CSV中的用户列表发送带有特定附件的电子邮件。脚本完成了它应该做的事情。我正在导入一个CSV并将其传输到ForEach-Object。例如:

代码语言:javascript
复制
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 }

同样,这也是按预期工作的。我的问题是,如果有一个错误,我不知道它发生在哪一个循环的迭代。

我已经知道了如何使用以下方法将错误传输到文件中:

代码语言:javascript
复制
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失败了。

根据微软发送邮件Cmdlet的文档,它不提供任何输出。

如果它能将$_.email连同错误一起打印给error.txt,我会很高兴的,但是我尝试过的一切都不能工作。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 01:40:34

我发誓,我现在只在这里发布尝试/捕捉回复。

因此,解决这个问题的方法是接受您的进程,添加-ErrorAction STOP,并将整个代码放在一个try/catch块中。这将允许我们尝试您的第一个命令,如果我们碰到了一个错误,那么我们将在catch块中运行代码位。我们将在这里添加一条更好的写错误消息,以便给出更好的输出。我们还会在一个变量中存储带有错误的变量,我们可以在最后输出。

代码语言:javascript
复制
$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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29403541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档