Set ws = CreateObject("WScript.Shell")
'這里創建一個對象引用,以便在以下示例代碼中使用。
'Demon注:這個變量名怎么這么猥瑣(WS)
語法:(常識(Demon注:常識這個詞我喜歡):作為過程使用時,不要加括號,否則出現編譯器錯誤(參數唯一或沒有時加括號不會出錯,但建議不要加))
ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
[Set objExec =] ws.Exec(strCommand)
WScript.Shell對象的這兩個方法:
都可以用來運行程序,且可以帶參數。
都可以在程序路徑中使用環境變量。
都不能為程序指定工作目錄、不能設置優先級(start命令可以)。
要指定工作目錄,只能通過改變腳本宿主(wscript.exe/cscript.exe)的當前工作目錄:ws.CurrentDirectory = "工作目錄"。(常識:工作目錄有何意義:1、有些程序需要相應目錄下的dll等相關文件支持 2、相對路徑問題)
Run和Exec的區別:
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可以設置程序運行時的運行模式(前臺后臺:是否隱藏窗口)、窗口大小、激活狀態(是否獲取“焦點”),具體參數請參考手冊。
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也不一定穩妥(Demon注:我之前也說過很多次,用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
'Demon注:這里不用這么復雜吧,LCase(Right(host, 11))不就行了
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的結果會在控制臺輸出,不會彈出對話框。
vbsRun方法
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
【參數】
object
WshShell 對象。
strCommand
表示要運行的命令行的字符串值。包括要傳遞到可執行文件的所有參數。
intWindowStyle
可選。表示程序窗口外觀的整數值。
請注意,并非所有程序都使用此信息。
bWaitOnReturn
可選。布爾值,表示在繼續執行腳本中的下一條語句之前,腳本是否等待執行完程序。
如果設為 true,則在執行完程序后才執行腳本,Run 方法返回由程序返回的任何錯誤代碼。
如果設為 false(默認值),則 Run 方法將自動在啟動程序后立即返回 0(不是錯誤代碼)。
【說明】
Run 方法返回一個整數。Run 方法啟動在新 Windows 進程中運行的程序。
可以讓腳本等到程序執行完后再繼續執行。這允許您同步運行腳本和程序。
strCommand 參數內的環境變量自動擴展。
如果某個文件類型已正確注冊到某個程序中,則對該類型的文件調用 Run 方法時將執行該程序。例如,如果您的計算機系統中裝有 Word,則對 *.doc 文件調用 Run 方法時將啟動 Word 并加載該文檔。
【intWindowStyle 說明 】
0 隱藏一個窗口并激活另一個窗口。
1 激活并顯示窗口。如果窗口處于最小化或最大化狀態,則系統將其還原到原始大小和位置。第一次顯示該窗口時,應用程序應指定此標志。
2 激活窗口并將其顯示為最小化窗口。
3 激活窗口并將其顯示為最大化窗口。
4 按最近的窗口大小和位置顯示窗口。活動窗口保持活動狀態。
5 激活窗口并按當前的大小和位置顯示它。
6 最小化指定的窗口,并按照 Z 順序激活下一個頂部窗口。
7 將窗口顯示為最小化窗口。活動窗口保持活動狀態。
8 將窗口顯示為當前狀態。活動窗口保持活動狀態。
9 激活并顯示窗口。如果窗口處于最小化或最大化狀態,則系統將其還原到原始大小和位置。還原最小化窗口時,應用程序應指定此標志。
10 根據啟動應用程序的程序狀態來設置顯示狀態。
【示例 1】
下面的 VBScript 代碼用記事本打開當前運行腳本的副本。
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%windir%\notepad " WScript.ScriptFullName
下面的 VBScript 代碼與上述代碼完成的操作相同,不同之處在于,它指定窗口類型,等待用戶關閉記事本,關閉記事本時保存從記事本返回的錯誤代碼。
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("notepad " WScript.ScriptFullName, 1, true)
【示例 2】
下面的 VBScript 代碼打開一個命令窗口,將路徑改為 C:\,并執行 DIR 命令。
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "cmd /K CD C:\ Dir"
Set oShell = Nothing
Run 方法:
Run方法有三個參數,
第一個參數是你要執行的程序的路徑,
第二個參數是窗口的形式,0后臺運行;1正常運行;2最小化;3最大化;缺省的話表示正常運行
第三個參數是表示這個腳本是等待還是繼續執行,如果設為了True,腳本就會等待調用的程序退出后再向后執行。
例1:
Set ws = CreateObject("WScript.Shell")
ws.Run "notepad",,True
ws.Run "iexplore"
例2:隱藏BAT執行窗口
Set ws = CreateObject("WScript.Shell")
ws.Run "x.bat",0
例3:
Set ws = CreateObject("WScript.Shell")
ws.Run "cmd /c netstat -an>>x.txt",0
例4:
Set ws = CreateObject("WScript.Shell")
ws.Run "taskkill /f /im iexplore.exe",0
Exec 方法
例1:運行文件
Set ws = CreateObject("WScript.Shell")
ws.Exec "notepad c:/x.txt" ‘對于Exec應指明程序,此notepad是必須的
例2:運行程序>獲取進程PID值>強行結束進程(沒有Run+taskkill強:如在記事本未保存的情況下結束進程,Exec會出錯,而Run不會)>判斷進程是否在運行(這個功能不錯)
Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("notepad")
MsgBox e.ProcessId
e.Terminate
WSH.Sleep 1000
MsgBox e.Status ‘0為運行,1為結束
例3:直接獲取dos命令輸出,dos窗口會閃一下,Exec沒有窗口控制功能
Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("ipconfig")
MsgBox e.Stdout.ReadAll
例4:
Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("cmd /c echo Hi")
MsgBox e.Stdout.ReadAll
您可能感興趣的文章:- vbScript中WScript.Shell對象的run和exec使用心得分享