停止 Windows 任务计划程序中的重复触发器直到第二天

sta*_*uxe 2 scheduled-tasks windows-server-2008

我们安排了一个 Windows 任务来启动一些自定义代码(作为可执行文件),每 15 分钟检查一次文件是否存在。

如果最终找到该文件,我们的服务会对其进行一些处理。问题在于:处理文件后,业务要求任务计划程序停止这些 15 分钟的检查,直到第二天。

有没有办法将逻辑插入到 Windows 任务计划程序中,以便在满足某些条件后停止运行其触发器?或者有更好的方法来构建这个流程吗?

我们使用 Windows Server 2008 R2 Standard SP1 来运行它。

小智 5

如何结束计划任务:

A.要从命令行终止当前正在运行的任务(即显示在“任务计划程序”->“显示所有正在运行的任务”中的任务):
schtasks.exe /End /TN "My task name"

B.阻止计划任务在未来被触发运行:
schtasks.exe /Change /TN "My task name" /DISABLE

C.要重新启用任务:
schtasks.exe /Change /TN "My task name" /ENABLE

通过键入以下内容可以获得更多详细信息:schtasks.exe /Change /?

D.要求终止一个进程(此处:记事本,但使用任务管理器 -> 进程\图像名称中显示的名称),该进程在运行上面的A.时不会终止:
taskkill.exe /IM Notepad.exe

E.强制终止运行上述D.时未终止的进程:
taskkill.exe /F /IM Notepad.exe /T

注意:使用 taskkill 并不是结束进程的干净方法。您可以在这篇文章及其链接到的文章中阅读更多内容。


如何根据您所描述的情况在任务计划程序中进行设置:

不要让您的任务直接运行自定义 .exe,而是将其更改为运行脚本(例如批处理文件、PowerShell 脚本、Python 脚本等),该脚本依次:

  • 触发自定义exe,然后
  • 测试文件是否已找到并“已处理”,然后
  • 调用上面的命令B.以停止其再次运行。

添加每天早上运行的第二个任务(选中“无论用户是否登录都运行”),通过调用上面的命令C.重新启用计划任务。

注意:要调用 schtasks.exe 需要提升权限,因此请将执行该命令的任务设置为“以最高权限运行”。


如何检测文件是否已被处理:

  • 让您的自定义 .exe 在成功运行时添加注册表项。您的脚本可以使用例如 reg.exe 来查找该条目(键入REG QUERY /?以获取详细信息)。

还有其他方法(例如发布 Windows 事件、发送消息等),但使用注册表对于简单脚本来说是一种简单的机制。

不要直接从 .exe 禁用该任务。将应用程序及其调用分开。如果您想稍后以不同方式禁用该任务,这也将使您不必重新编译。