抱歉,标题不好,但我很难用简洁的方式来描述这件事。
我编写了一个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失败了。
根据微软发送邮件Cmdlet的文档,它不提供任何输出。
如果它能将$_.email连同错误一起打印给error.txt,我会很高兴的,但是我尝试过的一切都不能工作。
任何帮助都将不胜感激。
发布于 2015-04-02 01:40:34
我发誓,我现在只在这里发布尝试/捕捉回复。
因此,解决这个问题的方法是接受您的进程,添加-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试试看,让我知道它是如何为你工作的。
https://stackoverflow.com/questions/29403541
复制相似问题