10

我有一个 cmd 脚本,它将执行一组补丁,如果需要重新启动以避免补丁问题,它被设计为中止。如果计划重新启动(例如通过“关闭”命令),我还想扩展脚本以中止,以便尽可能避免在补丁中重新启动。不幸的是,除了尝试安排另一次关机之外,我还没有找到一种方法来检测这一点,这会导致:

已安排系统关闭。(1190)

虽然理论上我可以使用它,但我认为每次我需要检查是否有计划的重启时吓跑已登录的用户并不是一个好习惯。我真正需要的是一种查询“关闭”命令修改的状态的方法。

这可能吗?我真的会对任何不涉及我在系统上永久运行应用程序以捕获关闭事件的解决方案感到满意(我认为在实际触发关闭之前甚至不会发送)

4

5 回答 5

4

我有同样的问题,我到处搜索,但没有找到任何有用的东西。

最终,我开始乱搞我能想到的不同的东西。对于我们的问题,我可以想到两种解决方法。

事件查看器可以告诉您已安排关闭,但不能告诉您安排的时间。

一种想法是向事件查看器查询最近的系统关闭、最近的计划关闭和计划关闭的最近取消。如果计划的关闭比最近的取消或关闭更近,则有一个正在进行中。事件 ID 为:1074 表示已启动的计划关机,1075 表示取消的计划关机,在 Windows 日志/系统下 12 用于系统启动 13 用于系统关闭(全部在 Windows 日志/系统下)

我懒得在批处理文件中执行此操作,但我知道这是可能的。

所以这就是我最终做的事情:与其安排关机,不如尝试中止它。如果没有正在进行的关机,它将引发错误(无法中止系统关机,因为没有正在进行关机。(1116))。我认为比通过安排关机来吓坏用户要好得多。

这是我为一个简单的自动关机脚本编写的代码副本,它在取消和启动预定关机之间切换。

@echo off
shutdown /a
if errorlevel 1 call:shutdown
goto end

:shutdown
    set /p choice=Shutdown in how many minutes? 
    set /a mod=60
    set /a mod*=%choice%
    shutdown /s /t %mod%

:end

编辑- 我正在重新审视这个答案,因为我有更多信息要添加。

上述解决方案将检测是否已通过使用 /t 参数的 shutdown.exe 命令安排关机。

如果您需要确定 Windows 是否已安排关机(就像在某些 Windows 更新后自动执行的那样),那么您可以查询一个已设置的注册表项。以下是在 PowerShell 中,但您可以编写一个批处理文件来执行相同的操作。

Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'

注意:如果使用shutdown.exe计划重启,这将不会返回true,只有当Windows说您的计算机需要重启时才会返回true。

于 2013-01-23T08:06:51.153 回答
2

您可以使用:

Shutdown /a "用于中止预定"

然后再次使用关闭来创建另一个计划。

于 2020-04-19T17:47:15.447 回答
0

如果您的脚本正在设置关闭,另一种方法是使用 setx 命令将 %date% 和 %time% 变量保存到全局环境中。然后,您可以在下次调用脚本时检查这些变量。

于 2015-02-23T12:59:29.880 回答
0

我想您可以使用任务计划程序 API来枚举计划任务并查看其中是否有任何调用 shutdown.exe。但我不确定这是否可靠。可能有多种方法可以安排关机。

于 2011-05-27T20:02:28.000 回答
0

也许您可以尝试通过以较大的宽限期调用ExitWindowsEx来启动关机,并检查返回码ERROR_SHUTDOWN_IS_SCHEDULED并在 ExitWindosEx 返回成功时立即调用AbortSystemShutdown(表明您已成功安排关机)

于 2011-05-27T20:06:38.313 回答