【发布时间】: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 "&{((Get-Date).AddDays(+1)).ToString('yyyyMMdd')}"') Do Set "d8=%%a"。您可能必须将USEBACKQ选项与FOR /F命令一起使用,因为您在powershell 代码中使用了单引号。我认为双引号可以保护它们。 -
@Duodenalsalmons IMO 付出的努力是值得的 - 您的脚本将更容易阅读和增强/修复/扩展。
-
@Bill_Stewart 你说得对。我已经进行了 2 天的转换,这是一个相当大的转变。感谢您的推动。
标签: powershell batch-file error-handling