正在检测预定的关机时间

| 我有一个cmd脚本,它将执行一组补丁程序,并且该脚本旨在中止是否需要重新启动以避免补丁程序问题。我还想将脚本扩展为在计划重新启动(例如通过“ shutdown \”命令)的情况下中止,以便在可能的情况下避免在补丁程序中重新启动。不幸的是,除了尝试安排另一个关机之外,我还没有找到一种方法来检测到这一点,结果是:   已经计划关闭系统。(1190) 虽然从理论上讲我可以使用此功能,但我认为每次需要检查计划的重新启动时都不要害怕登录用户,这不是一个好习惯。我真正需要的是一种查询由“ shutdown \”命令修改的状态的方法。 这可能吗?对于任何不涉及让我的应用程序在系统上永久运行以捕获关闭事件的解决方案,我都会感到非常满意(直到关闭触发真正触发,我才认为它会被发送出去)     
已邀请:
        我遇到了同样的问题,我到处搜索,但没有发现任何有用的信息。 最终,我刚刚开始想出一些不同的事情。我可以想到两个解决此问题的方法。 事件查看器可以告诉您已经安排了关闭,但是没有安排何时关闭。 一种想法是向事件查看器查询最近的系统关闭,最近的计划关闭以及最近取消的计划关闭。如果计划的关机比最近的取消或关机更近,则说明正在进行中。 事件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。     
        我想您可以使用Task Scheduler API枚举计划的任务,并查看其中是否有任何一个调用shutdown.exe。但是我不确定这是否可靠。可能有多种方法来安排关机。     
        执行此操作的另一种方法(如果脚本正在设置关闭)是使用setx命令将%date%和%time%变量保存到全局环境中。然后,您可以在下次调用脚本时检查这些变量。     
        也许您可以尝试通过在宽限期内调用ExitWindowsEx来启动关闭操作,并检查返回码ERROR_SHUTDOWN_IS_SCHEDULED,如果ExitWindosEx返回成功,则立即调用AbortSystemShutdown(指示您成功安排了关闭操作)     

要回复问题请先登录注册