背景:我正在尝试在计划任务失败时收到电子邮件通知。我的任务可以通过退出代码(错误级别)指示失败,我想使用它并遵循 this answer 中描述的过滤器方法来触发电子邮件。
问题:我在不同计算机和 Windows 版本上从任务计划程序获得不一致的行为。为了进行测试,我使用了以下非常简单的任务。
- 仅在用户登录时运行。 (其中“user”是当前用户)
- 操作:启动程序
- 程序/脚本:
cmd
- 参数:
/c "exit/b 1"
- 开始于:空白
- 程序/脚本:
- 其他一切:默认
我已启用任务历史记录,当我在 Windows 7 Ultimate 和 Windows Server 2008 R2 Enterprise 上手动运行该任务时,会在“操作已完成”类别中创建如下正确的历史记录项目:
Task Scheduler successfully completed task "\test" , instance "{abcdefgh-fab0-4a21-b51a-e25baaaa0000}" , action "C:\Windows\system32\cmd.EXE" with return code 1.
上次运行结果列中的文本对应于:(0x1)
。
但是,在 Windows Server 2012 (Azure VM) 上运行时,会出现以下错误消息:
Task Scheduler successfully completed task "\test" , instance "{abcdefgh-fab0-4a21-b51a-e25bbbbb1111}" , action "C:\Windows\system32\cmd.EXE" with return code 0.
(强调我的。)但是,上次运行结果列中的文本显示:错误的函数:(0x80070001)
。这表明任务调度处理器的至少一部分识别出某种程度的错误情况。如果我将参数替换为 /c "exit/b 0"
,则此列将显示: 操作成功完成。 (0x0)
我已经尝试了用户上下文、“开始于”目录、参数(带或不带 /b
)以及“配置为:”下的不同操作系统的各种值组合,但没有有效。
问题:如何让 Windows 2012 计算机上的任务计划程序在历史记录项中显示正确的返回代码?
解决方法:虽然我仍然想了解这种奇怪的行为(也许它表明了一些更重要的问题/误解),但我通过将以下内容添加到我的任务脚本中来解决我原来的问题:
$objMailMessage = New-Object System.Net.Mail.MailMessage
$objMailMessage.From = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e1949284938f808c84a1868c80888dcf828e8c" rel="noreferrer noopener nofollow">[email protected]</a>"
$objMailMessage.To.Add("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="265443454f564f43485266435e474b564a430845494b" rel="noreferrer noopener nofollow">[email protected]</a>")
$objMailMessage.Subject = "The task failed."
#$objMailMessage.Body = "Detailed information."
$smtp = new-object Net.Mail.SmtpClient("smtp.gmail.com", 587)
$smtp.EnableSsl = $true
$smtp.Credentials = new-object Net.NetworkCredential("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="20555345524e414d4560474d41494c0e434f4d" rel="noreferrer noopener nofollow">[email protected]</a>","pass")
$smtp.send($objMailMessage)
最佳答案
我在 Server 2012 上看到类似的问题,批处理文件看起来成功,在事件日志中显示返回值为 0,但上次运行结果为 0x80070001。
我看到 MSFT 有一个适用于 Server 2012 的修补程序,可能会解决此问题:
关于Windows 任务计划程序报告不正确/不一致的结果代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505759/