2

背景:我正在尝试在计划任务失败时收到电子邮件通知。我的任务可以通过退出代码(错误级别)指示失败,我想使用它并按照此答案中描述的过滤方法来触发电子邮件。

问题:我在不同的机器和版本的 Windows 上从任务计划程序中得到不一致的行为。为了测试,我正在使用以下非常简单的任务。

  • 仅在用户登录时运行。(其中“用户”是当前用户)
  • 行动:启动程序
    • 程序/脚本:cmd
    • 论据:/c "exit /b 1"
    • 开始于:空白
  • 其他一切:默认

我已启用任务历史记录,当我在 Windows 7 Ultimate 和 Windows Server 2008 R2 Enterprise 上手动运行任务时,会在“操作已完成”类别中创建如下正确的历史记录项:

任务计划程序成功完成任务“\test”,实例“{abcdefgh-fab0-4a21-b51a-e25baaaa0000}”,操作“C:\Windows\system32\cmd.EXE”,返回码为 1。

Last Run Result列中的文本对应于:(0x1)

但是,在 Windows Server 2012 (Azure VM) 上运行时,会出现以下错误消息:

任务计划程序成功完成任务 "\test" ,实例 "{abcdefgh-fab0-4a21-b51a-e25bbbbb1111}" ,操作 "C:\Windows\system32\cmd.EXE"返回代码 0

(强调我的。)但是Last Run Result列中的文本显示为:Incorrect function: (0x80070001)。这表明至少部分任务调度处理器识别出某种程度的错误情况。如果我将参数替换为/c "exit /b 0",则此列显示为:The operation completed successfully. (0x0)

我尝试了用户上下文、“开始于”目录、参数(带和不带/b)以及“配置为:”下的不同操作系统的各种值组合,但无济于事。

问题:如何让 Windows 2012 机器上的任务计划程序在历史记录项中显示正确的返回码?

解决方法:虽然我仍然想了解这种奇怪的行为(也许它表明一些更重要的问题/误解),但我正在通过将以下内容添加到我的任务脚本来解决我的原始问题:

$objMailMessage = New-Object System.Net.Mail.MailMessage
$objMailMessage.From = "username@gmail.com"
$objMailMessage.To.Add("recipient@example.com")
$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("username@gmail.com","pass")
$smtp.send($objMailMessage)
4

1 回答 1

1

我在 Server 2012 上看到类似的问题,批处理文件看起来成功,在事件日志中显示返回值为 0,但上次运行结果为 0x80070001。

我看到 MSFT 有一个可用于 Server 2012 的修补程序,它可能会解决这个问题:

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

于 2015-01-14T22:31:58.663 回答