背景:我正尝试在计划任务失败时收到电子邮件通知。 我的任务可以通过退出代码(errorlevel)指示失败,我想使用它,并按照本答案中描述的过滤方法来触发电子邮件。
问题:在不同的计算机和Windows版本中,我遇到了不一致的行为。 为了testing,我正在使用以下非常简单的任务。
cmd
/c "exit /b 1"
我启用了“任务历史logging”,当我在Windows 7 Ultimate和Windows Server 2008 R2 Enterprise上手动运行任务时,在类别“操作完成”中创build了类似以下的正确历史logging项:
任务计划程序成功完成任务“\ test”,实例“{abcdefgh-fab0-4a21-b51a-e25baaaa0000}”,操作“C:\ Windows \ system32 \ cmd.EXE”,返回代码1。
“ 上次运行结果”列中的文本对应于: (0x1)
。
但是,在Windows Server 2012(Azure VM)上运行时,会出现以下错误消息:
任务计划程序成功完成任务“\ test”,实例“{abcdefgh-fab0-4a21-b51a-e25bbbbb1111}”,操作“C:\ Windows \ system32 \ cmd.EXE” ,返回码为0 。
(Emphasis mine。)然而, 最后运行结果列中的文本读取: Incorrect function: (0x80070001)
。 这表示至less部分任务调度处理器识别出某种程度的错误状况。 如果我用/c "exit /b 0"
replace参数,这个列读取: The operation completed successfully. (0x0)
The operation completed successfully. (0x0)
我尝试了用户上下文,“开始”目录,参数(带和不带/b
)和不同的操作系统下的“configuration为:”的各种值的组合,无济于事。
问题:如何在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)
在server 2012上看到类似的问题,看起来像是成功的批处理文件,在事件日志中显示返回值为0,但上次运行结果为0x80070001。
我看到MSFT有一个可用于server 2012的修补程序可能解决此问题: