从批处理文件调用时,Send-MailMessage cmdlet捕获错误

时间:2018-12-04 19:27:13

标签: powershell batch-file error-handling

我有一个批处理文件,该文件使用PowerShell的Send-MailMessage cmdlet发送状态更新的电子邮件:

powershell -command " & {Send-MailMessage -SMTPServer smtp.somewhere.com -From 'Sender <sender@email.com>' -To 'Recipient <recipient@email.com>' -Subject 'Subject' -Body 'Body' -Attachments 'D:\Logs\Log.log';}"
if %ERRORLEVEL% neq 0 (
echo ERROR - Something went wrong sending the email
goto Error
)

如果Send-MailMessage命令失败(例如,找不到附件文件或其他错误),则%ERRORLEVEL%不会提高到0以上。

其他答案建议在PowerShell脚本中添加显式退出代码以返回代码,但是如果使用内置的PS cmdlet(如Send-MailMessage),则找不到如何捕获错误的任何信息。可以完成,还是需要在另一个PS脚本中包装Send-MailMessage?

1 个答案:

答案 0 :(得分:2)

将整个命令包装在try catch块中并引发显式错误。这将返回非零的退出代码。

powershell -command "Try {Send-MailMessage ... -ErrorAction Stop;} Catch { Exit 1 }"

在一行中阅读起来有点困难,但是:

powershell -command "Try {Send-MailMessage -SMTPServer smtp.somewhere.com -From 'Sender <sender@email.com>' -To 'Recipient <recipient@email.com>' -Subject 'Subject' -Body 'Body' -Attachments 'D:\Logs\Log.log' -ErrorAction Stop;} Catch { Exit 1 }"
if %ERRORLEVEL% neq 0 (
echo ERROR - Something went wrong sending the email
goto Error
)