使用批處理重新啟動計算機

chief1985發表於2008-10-23
 導讀:

今天在新聞組看到suichuanxian朋友回了一個帖子(地址在OXfUmTgWFHA.2256@TK2MSFTNGP14.phx.gbl),帖子原文如下:提問:請問各位大蝦,在批處理裡面怎麼模擬Enter鍵的事件?也就是說我想用批處理來代替人
工的回車或者空格鍵?因為我的一些程式在關閉的時候,提示是否結束,如果選在
“是”以後,程式關閉了,
系統才能夠成功重啟,否則不理他的話,系統就不能夠完成
重啟的動作。謝謝各位大蝦。
回答:把以下內容用記事本儲存為bat檔案就可以了,如reboot.bat,執行它就會自動重新啟
動。

@echo off
setlocal
cd/d %temp%
echo [version] > reboot.inf
set inf=InstallHinfSection DefaultInstall
echo signature=$chicago$ >> reboot.inf
echo [defaultinstall] >> reboot.inf
rundll32 setupapi,%inf% 1 %temp% eboot.inf
del reboot.inf
呵呵,看到這個帖子,又讓我回想起用inf解鎖regedit風行的年代。意興之餘就說說這個
指令碼的原理好了。其實這裡面用到的關鍵一句是RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 1 %temp% eboot.inf這裡的格式是RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection 關於Windows Rundll and Rundll32 Interface的用法,請參考 http://support.microsoft.com/kb/164787/zh-cn ,之前我也寫過rundll32用法的一個例子 http://gnaw0725.blogdriver.com/gnaw0725/259894.htmlsetupapi在這裡載入 InstallHinfSection功能項。關於此api其他export部分,用exescope或者編譯工具都可以很容易查到。(BTW:在winXP及以後版本,setupapi的執行將會隨之產生一個setupapi.log,它將會紀錄當前環境下安裝的裝置、servicepack以及hotfix,詳細內容請參考 http://www.microsoft.com/whdc/driver/install/setupapilog.mspx)<section> 這裡配合INF使用 InstallHinfSection, 關於 INF安裝的其他功能項請參考 INF File Processing Functions http://msdn.microsoft.com/library/default.asp?url=/library/en-us/install/hh/install/SetupAPI_95233d19-2970-409d-8b44-de661cbf68ae.xml.asp<mode> 是一個組合值,它的組合序列如下:
Value Description
0 系統提供INF
128 將安裝檔案的預設路徑設定為當前INF路徑。此為典型設定。
+0 不重新啟動計算機
+1 所有情況下都重新啟動計算機
+2 如果需要重新啟動,始終詢問使用者
+3 如果必要不經使用者許可直接重新啟動計算機
+4 如果需要重新啟動計算機,在啟動前提交使用者許可
<path> 指定INF檔案的路徑,這裡要使用絕對路徑。 這個用法適用於幾乎所有的客戶端作業系統,但這裡的 <mode> 一般不推薦賦值為 1 ,應該寫為 128+1=129 ,否則可能在某些環境下執行出現問題,不會重新啟動。這裡既然說到重新啟動系統,其實還可以用vbs來做,也只用一句話就夠了CreateObject("WScript.Shell").SendKeys "^{ESC}ur"但一般不推薦這樣寫,因為winxp登入方式有歡迎螢幕,也有非歡迎螢幕的登陸,對於後者這樣寫就不管用了,就要這樣寫CreateObject("WScript.Shell").SendKeys "^{ESC}u{DOWN}~"這裡有點技巧的就是 SendKeys,關於 SendKeys的用法,請參考 http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemwindowsformssendkeysclasssendtopic.asp ,這裡就不詳述了。之前我也曾寫過一個類似的例子,見於 http://gnaw0725.blogdriver.com/gnaw0725/358142.html但由於windows註冊鍵值對於上次關機狀態的記憶,連這個按鍵的順序也未必如此,所以除非您為特定的環境定製的指令碼,一般對於通用的環境建議還是老老實實來strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate,(Shutdown)}!" & _
        strComputer & " ootcimv2")

Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")

For Each objOperatingSystem in colOperatingSystems
    objOperatingSystem.Reboot()
Next

本文轉自
http://gnaw0725.blogbus.com/logs/4888543.html

相關文章