答案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
.
- 首先为您的任务添加一个新的触发器,当另一个任务失败时该触发器就会发生(可能是自动重试的同一任务!)
- 在“新建触发器”(或“编辑触发器”)对话框的顶部,
Begin the task:
选择On an event
- 选择,然后点击按钮。(稍后返回编辑时将显示
Settings
)Custom
New Event Filter
Edit Event Filter
- 将打开一个新对话框,单击
XML
其顶部的选项卡 - 检查
Edit query manually
选项并确认警告。 - 输入要使用的 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),当然,将全大写路径更改为任务计划程序中您想要监视的任务的路径(可以与此触发器所在的路径相同。)
然后单击所有“确定”按钮,同时更改您想要的任何其他选项。