背景:我正在尝试在计划任务失败时收到电子邮件通知。我的任务可以通过退出代码(错误级别)指示失败,我想使用它并按照此答案中描述的过滤方法来触发电子邮件。
问题:我在不同的机器和版本的 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)