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

Jam*_*ton 5 windows ups task-scheduler

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

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

但我认为这对于其他情况也可能是一个有用的技巧。任何时候在某事发生一段时间后您想做某事而没有恢复。例如,如果您在一段时间内无法与远程 PC 通信,请向智能配电盘发送消息以重新启动它...但如果通信恢复则不行。或者,如果您在一段时间内无法从一个来源获取数据,请切换到备份数据源……但如果主要来源开始响应,则不会。

可以做到吗?我看不出有什么办法...

Rya*_*ies 6

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

只是在开玩笑。这个怎么样...

使用 Task Scheduler 创建两个任务。每个任务都会在事件日志事件上触发。第一个任务将根据“交流电源消失”事件触发,它会执行类似shutdown /s /t 1200关闭系统的操作,延迟 1200 秒。然后第二个任务将根据“交流电源已恢复”的事件日志事件触发。第二个任务将执行 ashutdown /a以中止挂起的关闭。

我认为任何比这更先进的东西都需要编写脚本。


关掉


Mat*_*sen 3

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

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

PowerGone 任务:

Send-MailMessage -To "james@company.tld" -Body "Self-destruction sequence initiated, T-10m"
# We can still abort this task
Start-Sleep -Seconds 600
Send-MailMessage -To "everyone@company.tld" -Subject "Notice of termination..."
Start-Implosion -Force
Run Code Online (Sandbox Code Playgroud)

电源恢复任务:

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

$TargetTask = $TaskScheduler.GetFolder('\').GetTask('PowerGone')
$TargetTask.Stop()
Run Code Online (Sandbox Code Playgroud)