Windows 任务计划程序报告不正确/不一致的结果代码

标签 windows azure scheduled-tasks exit-code errorlevel

背景:我正在尝试在计划任务失败时收到电子邮件通知。我的任务可以通过退出代码(错误级别)指示失败,我想使用它并遵循 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 的修补程序,可能会解决此问题:

http://support.microsoft.com/kb/3003689

关于Windows 任务计划程序报告不正确/不一致的结果代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505759/

相关文章:

php - 测试设计 : How do I simulate the passage of time to test the detection of and response to events scheduled in the future?

Laravel 5 命令调度程序,如何传入选项

windows - 如何在成功时运行多个命令

iOS 推送通知 ASP.NET 与 Azure 移动服务通信

c# - 使用 MiniDump (DbgHelp.h) 获取句柄数据

azure - 添加新集合时对 Azure Cosmos DB 模拟器的高要求

azure - Azure 表存储中跨多个表的事务

java - 在 Liferay 计划作业中创建 Assets 类别

windows - c++/cli DLL 在 Win 8.1 下失败

c++ - 在 Windows 中编写引用 HDF5 的 CMakeLists 的正确方法