Set ws = CreateObject("WScript.Shell") '這裏創建一個物件引用,以便在以下示例代碼中使用。
語法:(常識:作為過程使用時,不要加括弧,否則出現編譯器錯誤(參數唯一或沒有時加括弧不會出錯,但建議不要加))
ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
[Set objExec =] ws.Exec(strCommand)
WScript.Shell物件的這兩個方法都可以用來運行程式,且可以帶參數。
都可以在程式路徑中使用環境變數。
都不能為程式指定工作目錄、不能設置優先順序。start命令可以。
要指定工作目錄,只能通過改變腳本宿主(WScript.exe/CScript.exe)的當前工作目錄:ws.CurrentDirectory = "工作目錄"
(常識:工作目錄有何意義:1、有些程式需要相應目錄下的dll等相關檔支援 2、相對路徑問題)
1、run可以直接運行檔(包括協議檔),會啟動相關聯的程式打開該檔(沒有關聯則出錯)。start有此功能(更高級,沒有關聯時會打開“打開方式”對話方塊)。
exec只能運行程式。
ws.run "c:\boot.ini"
ws.exec "notepad c:\boot.ini"
2、run不僅可以直接運行位於path環境變數目錄中的程式,還能運行在註冊表App Paths中設置的程式“別名”。start有此功能。
exec不行,只能直接運行位於path環境變數目錄中的程式。
ws.run "iexplore" 'iexplore 在 App Paths 中登記了別名。
ws.exec "calc"
3、run可以等待程式運行結束再執行下面的命令。start有此功能。
exec不行。
ws.run "notepad", , true
4、exec運行的程式路徑中即使含有空格,也可以不加引號(參數如需引號,它的引號不能省略)。
run、start沒有這個本領。
(常識:vbs中一個引號字元"本身要用兩個引號表示,即寫成""。也可以用Chr函數得到引號:chr(34))
ws.exec "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
ws.exec """C:\Program Files\Internet Explorer\IEXPLORE.EXE"""
ws.run """C:\Program Files\Internet Explorer\IEXPLORE.EXE"""
5、最大的區別是:
run著重於啟動控制(設置視窗形式)。(start聽名字知道是為了啟動,也可以簡單設置視窗最大化、最小化。)
exec著重於後續控制,並著重於控制命令行程式。
run可以設置程式運行時的運行模式(前臺後臺:是否隱藏視窗)、視窗大小、啟動狀態(是否獲取“焦點”),具體參數請參考手冊《Windows 腳本技術》(Script56.chm)中關於run方法的說明。
exec在啟動程式後還能對其進行控制:獲取運行狀態、獲取PID、強行中止進程。如果運行的是命令行程式,還能提供對 StdIn/StdOut/StdErr 流的訪問:寫入執行命令、獲取命令輸出等。運行命令行程式後只能通過StdIn寫入命令,控制臺視窗不再接受用戶輸入。
ws.run "notepad", 0 '隱藏視窗
ws.run "notepad", 4 '運行後不啟動,不打擾原來的活動視窗
注意,手冊上明確指出,run不能約束所有程式都按它指定的視窗形式運行,有些程式不聽它的話,比如iexplore、calc等。運行ieplore時,它會奪取焦點成為活動視窗。run無法以最小化運行calc。
Set oExec = ws.Exec("mspaint")
WScript.Echo oExec.ProcessId
oExec.Terminate
WScript.Echo oExec.Status '0為運行,1為結束
Set oExec = ws.Exec("ipconfig")
WScript.Echo oExec.StdOut.ReadAll
exec的應用
1、Runas自動輸入密碼
可能是設計時為安全考慮,runas不接收管道傳遞或從檔重定向得到,輸入密碼必須手動輸入,這個問題困擾了不少人,卻又難以解決,用Sendkeys也不一定穩妥。
如果用exec方法,就能輕鬆做到自動輸入。
複製內容到剪貼板
代碼:
Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("cmd.exe")
oexec.StdIn.WriteLine "runas /user:username setup.bat"
oexec.StdIn.WriteLine "password"
2、exec與run的結合使用
exec方法無法隱藏視窗,要得到命令行程式的輸出,就會有一個黑呼呼的視窗一閃而過,不僅難看,還會讓其他使用者誤以為是木馬什麼的,很不完美。如何解決這個問題呢?就讓exec與run合作吧!
複製內容到剪貼板
代碼:
Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
if LCase( right(host, len(host)-InStrRev(host,"\")) ) = "wscript.exe" then
ws.run "cscript """ & WScript.ScriptFullName & chr(34), 0
WScript.Quit
end if
set oexec = ws.Exec( "ipconfig")
Msgbox oExec.StdOut.ReadAll, , "ipconfig"
' 此時不要用WScript.Echo,因為當前是在控制臺運行,WScript.Echo的結果會在控制臺輸出,不會彈出對話方塊。