根据 Windows 任务计划程序中的退出代码采取行动

根据 Windows 任务计划程序中的退出代码采取行动

我有以下.bat 脚本:

set /a num=%random% %%2
exit /b %num%

我想在 Windows 任务计划程序中以这样的方式执行该批处理脚本:当退出代码为 1 时,任务计划程序会发送一封电子邮件,提示脚本失败。

我可以创建一个监视事件的不同任务,但是我无法根据 bat 脚本的退出代码看到事件的任何差异。

退出代码 = 0 和 = 1 的历史记录如下。

在此处输入图片描述

exit 0和之间的区别exit 1在于 eventId = 201 中有一个注释,说明退出代码是什么。

答案1

任务计划程序的问题在于,无论返回什么退出代码,任务总是记录事件 ID 201 - 操作已完成...这是正确的...无论如何,即使运行的作业在内部失败,任务也会完成。

进一步观察,在查看记录的事件时单击“详细信息”选项卡,我们可以看到ResultCode中的EventData确实设置正确。所以通过 GUI 过滤它是一项简单的工作,对吧?.... 嗯,不是... 除了 EventID 之外没有过滤器。现在我们必须编写一个自定义事件过滤器来根据 触发ResultCode。我们需要的 XML XPath 查询是这样的:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
      *[System[(Level=4 or Level=0) and (EventID=201)]]
        and
      *[EventData[Data[@Name='ResultCode'] and (Data='2147942401')]]</Select>
  </Query>
</QueryList>

因此,为了分解它,我们想要:

Event log: Microsoft-Windows-TaskScheduler/Operational
Event Level: 4 or 0 = Information
Event ID: 201
And
Event Data: ResultCode = 2147942401

如果我们将错误退出代码设置为 1,为什么是ResultCode = 2147942401?因为它实际上返回0x1的是十六进制0x80070001,等于十进制2147942401。因此,要获取“正确”的结果代码,您必须找到您的事件,然后单击“详细信息”选项卡,然后您就可以找到要过滤的“正确”结果代码。

答案2

我的回答基于HAL9256的回答,非常感谢您为我指明正确的方向。

事实证明,用于查看事件的相同 XML 查询(例如在自定义视图中的事件查看器中 - 对于调试查询非常方便)也可用于触发Custom event filter.

  1. 首先为您的任务添加一个新的触发器,当另一个任务失败时该触发器就会发生(可能是自动重试的同一任务!)
  2. 在“新建触发器”(或“编辑触发器”)对话框的顶部,Begin the task:选择On an event
  3. 选择,然后点击按钮。(稍后返回编辑时将显示SettingsCustomNew Event FilterEdit Event Filter
  4. 将打开一个新对话框,单击XML其顶部的选项卡
  5. 检查Edit query manually选项并确认警告。
  6. 输入要使用的 XML。以下是我最终得到的结果:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
      *[System[(EventID=201)]]
        and
      *[EventData
          [Data[@Name='ResultCode']!=0]
          [Data[@Name='TaskName']='\PATH-TO-TASK-BEING-WATCHED']
       ]
    </Select>
  </Query>
</QueryList>

对于提问者的问题,具体来说,将!=0(由任何非零退出代码触发)更改为=2147942401(退出代码 1),当然,将全大写路径更改为任务计划程序中您想要监视的任务的路径(可以与此触发器所在的路径相同。)

然后单击所有“确定”按钮,同时更改您想要的任何其他选项。

相关内容