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

Posted

技术标签:

【中文标题】在 Windows 任务计划程序中停止重复触发,直到第二天【英文标题】:Stop a recurring trigger in Windows Task Scheduler until the next day 【发布时间】:2013-12-27 06:05:42 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

如何结束计划任务:

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 并不是结束进程的干净方法。你可以阅读更多in this post和in the article it links to。

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

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

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

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

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

如何检测文件已被处理:

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

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

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

【讨论】:

以上是关于在 Windows 任务计划程序中停止重复触发,直到第二天的主要内容,如果未能解决你的问题,请参考以下文章

计划的 Powershell 触发时不会运行,手动运行时不会停止运行

Windows 任务计划程序:由于超时而停止任务错误

怎么让windows计划任务每隔几分钟运行一次?

编辑 Windows 任务计划程序任务的触发器

.net 应用程序在通过计划任务触发时失败

Windows 任务计划程序“忽略启动请求,实例已在运行”