我在 Windows 任务计划程序中设置了两个任务。一个任务应该在凌晨 3:00 运行,另一个任务应该在 15 分钟后运行。如果任务计划运行时计算机处于关闭状态,则任务将设置为在计算机启动时运行。这样做的问题是两个任务不能同时运行。我想要做的是等待两个任务中的第一个任务完成,一旦它完成,等待 15 分钟再开始第二个任务。我如何在任务计划程序中设置它?我无法将系统设置为在第一个任务完成后立即开始执行第二个任务,因为这两个任务只不过是调用另一个程序的批处理文件,而这些批处理文件对该程序执行的两件事不能同时完成。由于第一个任务只需要 5 分钟,所以我需要为第二个任务的开始留出一些余地。
答案1
答案2
我很感激这已被标记为已回答,但在我的场景中我有一个要求,我无法修改“触发”任务。
解决方案是创建一个带有自定义事件过滤器触发器的任务,该触发器在触发器任务完成时触发。此解决方案的来源来自这里但我已在下面解释了主要部分。
在任务计划程序中选择触发任务,然后在下面的窗格中选择“历史记录”选项卡。假设此任务至少完成过一次,您应该能够看到任务类别为“任务已完成”的事件。右键单击“任务已完成”事件并选择“事件属性”。在打开的“事件属性”窗口的“详细信息”选项卡中,选择 XML 视图,该视图应如下所示(可能已删除敏感信息):
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" />
<EventID>102</EventID>
<Version>0</Version>
<Level>4</Level>
<Task>102</Task>
<Opcode>2</Opcode>
<Keywords>0x8000000000000001</Keywords>
<TimeCreated SystemTime="2014-01-21T15:28:27.746689500Z" />
<EventRecordID>978</EventRecordID>
<Correlation ActivityID="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" />
<Execution ProcessID="10656" ThreadID="11656" />
<Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>
<Computer>XXXXXXXXXXXXXXXXXXXXXXXXXX</Computer>
<Security UserID="S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXX" />
</System>
<EventData Name="TaskSuccessEvent">
<Data Name="TaskName">\ping</Data>
<Data Name="UserContext">XXXXXXXXXX\XXXXXXXXXXXXX</Data>
<Data Name="InstanceId">{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}</Data>
</EventData>
</Event>
您需要编写的自定义触发器基本上是一个 XPath 表达式,其计算结果为与触发任务的任务完成事件相匹配的过滤器。对于名为“ping”的任务,触发器将是:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[EventData[@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\ping']]</Select>
</Query>
</QueryList>
在“编辑触发器”窗口中,您可以设置“延迟任务:15 分钟”,这应该可以实现所需的结果,而无需修改原始任务。
还有很多其他 XPath 可以编写,以制作更精美的触发器。这博客文章提供了更多信息,并且这个Microsoft 文档似乎是深入阅读的一个良好开端。