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的結果會在控制臺輸出,不會彈出對話方塊。

 

文章標籤
創作者介紹
創作者 m1016c 的頭像
m1016c

Martin Chang的部落格

m1016c 發表在 痞客邦 留言(0) 人氣()