Windows 任务计划程序仅在特定任务的事件上运行

Windows 任务计划程序仅在特定任务的事件上运行,windows,powershell,taskscheduler,Windows,Powershell,Taskscheduler,我有一个可以触发电子邮件的powershell脚本,我已将其保存为EmailScript.PS1(脚本没有问题,运行正常)。我计划在登录事件时安排此脚本,例如: Event ID:111 Description:Task terminated 无论何时触发所需事件,我都能够成功地安排此脚本 但是,目前它考虑了在任务调度器中运行的所有任务(例如,不是名为xyz的目标任务) 我只想在为特定任务(不是所有任务)触发事件时安排此基于事件的任务,但在任务计划程序的“创建任务”选项卡中找不到此类筛选

我有一个可以触发电子邮件的powershell脚本,我已将其保存为
EmailScript.PS1
(脚本没有问题,运行正常)。我计划在登录事件时安排此脚本,例如:

Event ID:111    Description:Task terminated
无论何时触发所需事件,我都能够成功地安排此脚本

但是,目前它考虑了在任务调度器中运行的所有任务(例如,不是名为
xyz
的目标任务)

我只想在为特定任务(不是所有任务)触发事件时安排此基于事件的任务,但在任务计划程序的“创建任务”选项卡中找不到此类筛选器/下拉列表


如果您有任何建议/帮助,我们将不胜感激。

您可以在事件日志中查询
111
事件id的最新实例,并从中获取任务名称:

$event = Get-WinEvent -FilterHashtable @{Id=111;LogName='Microsoft-Windows-TaskScheduler/Operational'} -MaxEvents 1
$taskName = $event.Properties[0].Value

if($taskName -ne '\xyz'){
    # not the right task, abort
    exit
}

我建议使用自定义XML事件过滤器来实现这一点,因为它为您选择触发哪种类型的事件提供了更大的灵活性

为此,请执行以下操作:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
        *[EventData[Data[@Name='TaskName']='\TASK_NAME_HERE']]
        and
        *[System[(EventID='102' or EventID='103')]]
        </Select>
  </Query>
</QueryList>
  • 转到触发器选项卡,然后单击新建/编辑触发器
  • 开始任务部分将类型更改为“在事件上”
  • 单击“设置”部分下的“自定义选项”
  • 单击编辑事件筛选器。。。按钮
  • 转到XML选项卡,然后在菜单底部按下手动编辑查询按钮
  • 复制并粘贴下面的XML并确定更改
注意:确保将此处的任务名称替换为要触发的任务名称。此外,如果要在不同的事件类型上触发,可以使用不同的事件名称替换TaskSuccessEvent

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[EventData[@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\TASK_NAME_HERE']]</Select>
  </Query>
</QueryList>

*[EventData[@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\TASK\u Name\u HERE']]
编辑:要匹配特定任务的多个事件ID,可以执行以下操作:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
        *[EventData[Data[@Name='TaskName']='\TASK_NAME_HERE']]
        and
        *[System[(EventID='102' or EventID='103')]]
        </Select>
  </Query>
</QueryList>

*[EventData[Data[@Name='TaskName']='\TASK\u Name\u HERE']]
和
*[系统[(EventID='102'或EventID='103')]]

如需更多阅读,请参阅以下内容:

谢谢@Mathias。所以我必须将现有的PS脚本包装在if语句下,并每天安排它?(很抱歉,我的PS不太好):@anky_91或者那样做,或者只是将代码添加到
EmailScript.ps1
的顶部,以便在最后终止的任务不是您感兴趣的任务时退出:)我添加了一个解释,用于匹配多个事件ID,并进一步阅读该主题。