2011-05-27 90 views
6

我有一個cmd腳本,它將執行一組修補程序,如果需要重新引導以避免修補問題,它將被放棄。如果計劃重新啓動(例如,通過「關閉」命令),我還想擴展腳本以中止以避免在可能的情況下重新啓動中間修補程序。不幸的是我沒有設法找到一種方法,從試圖安排一次停機,從而導致檢測到這種分開:檢測計劃關機

系統關機已定(1190)

雖然我理論上可以使用這個我不認爲每次我需要檢查計劃的重新啓動時嚇着登錄的用戶是不錯的做法。我真正需要的是一種查詢「關閉」命令修改狀態的方法。

這可能嗎?我真的很滿意任何解決方案,不涉及我有一個應用程序永久運行在系統上來捕捉關機事件(我認爲甚至不會發送,直到關機實際觸發爲止)

回答

0

我想你可以使用Task Scheduler API枚舉計劃的任務,看看它們中的任何一個是否調用shutdown.exe。但是我「米不知道這是穩健的。可能有多種方式來安排關機。

+0

是的,不幸的是有幾種方法,到目前爲止我還沒有弄清楚「shutdown/r/t 60」命令如何安排它。它似乎不是一個計劃任務 - 它可能是一個低得多的水平,這使得很難檢測到沒有一個明確的API :( – Ificator 2011-05-31 16:44:16

0

也許你可以嘗試通過調用ExitWindowsEx用大寬限期啓動關機並檢查返回代碼ERROR_SHUTDOWN_IS_SCHEDULED和呼叫如果AbortSystemShutdown立即ExitWindosEx返回成功(表示你成功地安排了關機)

+0

感謝您的建議。我把這作爲最後的手段,雖然因爲我真的不'不想讓機器上的任何用戶與週期性的「機器重啓」,「開玩笑」通知混淆。 – Ificator 2011-05-31 16:43:07

1

我有同樣的問題,我找遍了,但沒有發現任何有用的東西。

最後,我剛開始用不同的事情上浪費我可以想到,我可以想到兩種解決方法我們的問題。

事件查看器可以告訴您關機已安排,但沒有安排時間。

一個想法是查詢事件查看器以查看最近的系統關閉,最近的計劃關閉以及計劃關閉的最近取消。如果計劃的關閉比最近的取消或關閉更新,那麼正在進行中。 事件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的計劃,它只會Windows是否說你的電腦需要重新啓動返回true,這將不會返回true。

0

如果腳本設置關閉,另一種方法是使用setx命令將%date%和%time%變量保存到全局環境中。然後,您可以在下次調用腳本時檢查這些變量。