取消/阻止由 Windows“任务计划程序”延迟触发的任务

取消/阻止由 Windows“任务计划程序”延迟触发的任务

这与特定问题有关,但我认为这是一个“有趣”的通用问题:在 Windows(对我来说,特别是 2k8 服务器)中,您有一个由事件触发的任务(具体来说,UPS 由于电源故障而使用电池供电),延迟(电池将持续至少 15 分钟),然后执行某些操作(具体来说,shutdown /s /t 60 /d U:6:12)。但是,如果在延迟期间发生其他事件(具体来说,UPS 由于电源已恢复而关闭电池供电),则应该阻止第一个任务的发生(具体来说,不要关机)。

我开始考虑这个问题是因为我的 UPS 附带的用于管理服务器关机的软件是纯粹的……哦,我在这里应该礼貌一点,不是吗?……嗯……非常非常不好。所以我在想如何在没有它的情况下提供电池耗尽前的标准关机功能。通常,系统会从 UPS 收到电池即将耗尽的消息,然后关闭。这个 UPS 不会发送该消息。它发送“我使用电池”、“我使用交流电”,仅此而已。没有“我快要死了”的消息。

但我认为这对其他情况也很有用。任何时候,当某件事发生一段时间而无法恢复后,你总想做点什么。例如,如果你在一段时间内无法与远程 PC 通信,请向智能电源板发送一条消息以关闭电源循环...但如果通信恢复,则不行。或者,如果你在一段时间内无法从一个来源获取数据,请切换到备份数据源...但如果主源开始响应,则不行。

可以做到吗?我没找到办法……

答案1

扩展 Ryan 的方法,使用 2 个任务,一个由“电源断电”触发,另一个由“电源恢复”事件触发“中止”按钮任务

如果你需要做一些更通用的事情(不是每个可执行文件都有类似的中止开关shutdown),并且想要在开始向管理层发送电子邮件、擦除磁盘或自毁数据中心(或任何其他你想在紧急情况下自动执行的操作)之前保留几分钟的缓冲,你可以让第一个任务停滞/等待一段时间,并让第二个任务在触发时停止第一个任务:

PowerGone 任务:

Send-MailMessage -To "[email protected]" -Body "Self-destruction sequence initiated, T-10m"
# We can still abort this task
Start-Sleep -Seconds 600
Send-MailMessage -To "[email protected]" -Subject "Notice of termination..."
Start-Implosion -Force

PowerBack 任务:

$TaskScheduler = New-Object -ComObject Schedule.Service
$TaskScheduler.Connect("localhost")

$TargetTask = $TaskScheduler.GetFolder('\').GetTask('PowerGone')
$TargetTask.Stop()

答案2

这是一个好主意。我会用 Powershell 或 C# 在几个小时内为您编写此代码,费用非常低廉。;)

开玩笑的。这样怎么样……

使用任务计划程序创建两个任务。每个任务都将在事件日志事件上触发。任务一将基于“交流电断电”事件触发,并将执行一项操作,例如shutdown /s /t 1200延迟 1200 秒关闭系统。然后,第二个任务将基于事件日志事件“交流电已恢复”触发。第二个任务将执行一项操作shutdown /a以中止待处理的关机。

我认为任何比这更高级的事情都需要编写脚本。


关闭

相关内容