【问题标题】:Catch error from Send-MailMessage cmdlet when called from batch file从批处理文件调用时从 Send-MailMessage cmdlet 捕获错误
【发布时间】:2019-05-06 07:15:33
【问题描述】:

我有一个批处理文件,它使用 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 脚本中添加显式退出代码以返回代码,但如果使用像 Send-MailMessage 这样的内置 PS cmdlet,我找不到任何关于如何捕获错误的信息。可以做到吗,还是我需要将 Send-MailMessage 包装在另一个 PS 脚本中?

【问题讨论】:

  • 为什么需要批处理脚本?只需从 PowerShell(或 PowerShell 脚本)运行命令。
  • @Bill_Stewart 我刚刚发布了一个实际批处理文件的小sn-p,它有点像野兽。我可能会花几天时间在 PowerShell 中重新编写整个内容......但如果可能的话,我更愿意将其保存在批处理中
  • 您可以使用FOR /F 命令捕获其他控制台命令的输出。因此,如果我在批处理文件中并想从日期中减去,我将调用 Powershell 并捕获输出。 For /F "delims=" %%a In ('PowerShell -Command "&amp;{((Get-Date).AddDays(+1)).ToString('yyyyMMdd')}"') Do Set "d8=%%a"。您可能必须将USEBACKQ 选项与FOR /F 命令一起使用,因为您在powershell 代码中使用了单引号。我认为双引号可以保护它们。
  • @Duodenalsalmons IMO 付出的努力是值得的 - 您的脚本将更容易阅读和增强/修复/扩展。
  • @Bill_Stewart 你说得对。我已经进行了 2 天的转换,这是一个相当大的转变。感谢您的推动。

标签: powershell batch-file error-handling


【解决方案1】:

将整个命令包装在 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
)

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多