Windows 任务计划程序 - 什么情况下任务被视为“错过”或“失败”?

Windows 任务计划程序 - 什么情况下任务被视为“错过”或“失败”?

我很难总结一下,所以标题最终就是我认为我需要回答的问题。不过,以下是我提出这个问题的背景:

我目前正在尝试创建一个 Windows 任务,该任务将每月自动在办公室的计算机上执行一次程序。不过这里的工作时间比较灵活,我不能指望人们会在特定时间登录他们的计算机。

此程序偶尔需要用户输入并创建弹出对话框;我没有在后台运行它的选项。它是通过批处理脚本执行的,因为程序执行后需要进行文件操作。明确地说,我的任务的唯一操作是启动此批处理文件。

我尝试了两种最明显的设置:

错过预定的启动时间后尽快运行任务

似乎什么都没做。我希望能够找到关于何时将任务视为“错过”的详细解释。显然,它不包括需要用户登录但其预定时间在用户未登录时已过去的任务。

如果任务失败,则重新启动每一个...

似乎什么也没做。我能够通过更改任务配置,在用户未登录时运行,使我的任务在任务计划程序中产生 (0x4) 的结果。我以为这会被视为失败,但它并没有触发任何进一步执行任务的尝试。

我需要这个任务在 (1) 每月第一个星期一上午 8:50 或 (2) 之后尽快执行。这似乎是一个很简单的目标,但这些设置并没有像它们应该的那样运行,这让我非常沮丧。

我是否需要学习 PowerShell 才能在错过启动后运行任务?

答案1

对于 OP 来说可能有点晚了,但对于其他人来说可能会有用。

错过预定的开始时间后尽快运行任务:

“错过” = 任务未在触发时激活/启动;例如,如果计算机已关闭或任务计划程序 (TS) 服务繁忙。
注意:如果 TS 不必根据您的设置启动任务,则不会将其视为“错过”;例如:
-- 您设置为“仅在用户登录时运行”,并且计算机关闭或注销;
-- 您未设置为“唤醒以运行此任务”,并且计算机进入睡眠状态

如果不选中该设置,TS 不会重新尝试错过的任务实例。
选中该设置后,TS 服务将重新启动任务,但不是 TS 服务再次运行时立即重新启动,而是在十分钟后重新启动。
但要使此设置生效:任务必须在触发器中具有到期日期,或设置为无限期重复(可能意味着“每隔 x... 重复一次任务”,基于下面的第二个参考)
https://docs.microsoft.com/en-us/windows/win32/taskschd/tasksettings-startwhenavailable
https://social.technet.microsoft.com/Forums/lync/en-US/75ebd369-5aca-4482-8f16-f102437b2ba8/running-a-task-in-task-scheduler-after-the-due-date-has-passed

如果任务失败,则每 x 个单位重新启动一次;最多尝试重新启动 y 次:

这里仅涉及 TS 成功启动/激活的任务(即正确注册,并且没有错过触发条件)。
“失败”不一定与操作(任务的一部分,在“属性”的“操作”选项卡中设置)有关,退出代码不是 0,而是与 TS 服务无法成功启动任务中的每个操作有关。
一旦 TS 无法启动其中一个操作,整个任务也会“失败”。TS 通过特定事件(例如,事件 103)指示任务实例“失败”。这些失败事件可能由于多种原因而发生 - 因此与各种错误代码/值相关联,这也是 TS GUI 中“最后结果”列中显示的输出。您可以在任务的历史记录中或事件查看器、任务计划程序的日志(任务历史记录实际上从中获取条目)中看到该事件。
运行失败事件之前有(至少一个)另一个指示失败的事件,更接近错误的起源。例如无法正确更新任务的属性,或者 TS 无法启动运行任务所需的内部模块,或者无法启动发生错误的任务列表中的某个操作(在我的 Windows 7 上,事件 ID 203 先于 103)... 它通常具有与随后的任务失败事件相同的错误代码。

我找不到 Windows 7 的运行失败事件及其错误代码的列表,但是,根据此链接(事件和错误部分重定向):
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-7/dd349347(v=ws.10)#troubleshooting-events-and-errors
它们必须与服务器 2008 R2 的非常相似或相同:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/dd363654(v=ws.10)
最相关的是“任务监控和控制”(反映 TS GUI 中看到的历史记录),任务失败事件为 202;以及“任务属性”,任务失败事件为 101、103(我在使用 win7 时见过)。每个事件之前都可能出现各种失败事件,这些事件可以在以下位置找到:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/dd363654(v=ws.10)

一些示例:
-- 如果用户中断运行,则不是 TS 的错,因此... 这是一个“成功”(但最后结果不是 0)
-- 如果程序没有提供正确的参数,则它仍会产生(非零)退出代码,因此 TS 认为它的工作已完成 => “成功”
-- 如果您将不存在的文件作为“程序”,则 TS 无法启动它,并且... 认为它“失败”。事件 203 和 103 表明了这一点,错误代码 = 最后结果:0x80070002;谷歌搜索显示“文件未找到”。
并且,如果您选择“如果任务失败,则每 x 个单位重新启动一次”,它将尝试重新启动它...

对于OP的具体场景:

假设您可以将批处理文件放在每台目标计算机上,在相应的用户帐户中,在每台计算机上设置一个计划任务:

在“常规”选项卡中:
将用户设置为目标用户或组用户,并“仅在用户登录时运行”(由于任务需要用户交互,因此是必要的)

在触发器中:
“开始”:当前月份的第一天,上午 8:50;“按计划”,每月,并选择所有月份,然后在其下方:“开启”:第一个,星期一。
然后在“高级设置”中设置为“每隔 30 分钟重复一次任务”(30 分钟或您选择的时间),“持续时间为”(8 小时,或者您知道它们的工作持续时间)。以及“在重复持续时间结束时停止所有任务”。

在“条件和设置”选项卡中:保持不变。

然后在批处理脚本的末尾(如果存在,则在最后的“退出”之前,表示脚本已成功运行)需要放置一些代码来更改计划任务的属性,以便它在脚本完成后停止在当天的剩余时间内每 x 分钟重新启动一次,如上面的“每隔...重复一次任务”中设置的那样。
一种方法是将任务的“开始”月份增加 1(假设您已将日期设置为 1),但第 12 个月除外 - 更改为 1。schtasks命令允许查询和更改计划任务。
这可以用批处理语言来完成。

答案2

您可以在此主题中找到更多信息:

https://stackoverflow.com/questions/36281197/the-operator-or-administrator-has-refused-the-request-task-scheduler

就我而言,问题是由于缺乏权限,尝试运行脚本的用户不被允许这样做,但错误消息完全具有误导性。

相关内容