VBS中Run和Exec的區(qū)別
來(lái)源:易賢網(wǎng) 閱讀:1417 次 日期:2016-06-30 10:02:05
溫馨提示:易賢網(wǎng)小編為您整理了“VBS中Run和Exec的區(qū)別”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了VBS中Run和Exec的區(qū)別,需要的朋友可以參考下

Set ws = CreateObject("WScript.Shell")

'這里創(chuàng)建一個(gè)對(duì)象引用,以便在以下示例代碼中使用。

'Demon注:這個(gè)變量名怎么這么猥瑣(WS)

語(yǔ)法:(常識(shí)(Demon注:常識(shí)這個(gè)詞我喜歡):作為過(guò)程使用時(shí),不要加括號(hào),否則出現(xiàn)編譯器錯(cuò)誤(參數(shù)唯一或沒(méi)有時(shí)加括號(hào)不會(huì)出錯(cuò),但建議不要加))

代碼如下:

ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

[Set objExec =] ws.Exec(strCommand)

WScript.Shell對(duì)象的這兩個(gè)方法:

都可以用來(lái)運(yùn)行程序,且可以帶參數(shù)。

都可以在程序路徑中使用環(huán)境變量。

都不能為程序指定工作目錄、不能設(shè)置優(yōu)先級(jí)(start命令可以)。

要指定工作目錄,只能通過(guò)改變腳本宿主(wscript.exe/cscript.exe)的當(dāng)前工作目錄:ws.CurrentDirectory = "工作目錄"。(常識(shí):工作目錄有何意義:1、有些程序需要相應(yīng)目錄下的dll等相關(guān)文件支持 2、相對(duì)路徑問(wèn)題)

Run和Exec的區(qū)別:

1、Run可以直接運(yùn)行文件(包括協(xié)議文件),會(huì)啟動(dòng)相關(guān)聯(lián)的程序打開(kāi)該文件(沒(méi)有關(guān)聯(lián)則出錯(cuò))。start有此功能(更高級(jí),沒(méi)有關(guān)聯(lián)時(shí)會(huì)打開(kāi)“打開(kāi)方式”對(duì)話(huà)框)。Exec只能運(yùn)行程序。

代碼如下:

ws.Run "c:\boot.ini"

ws.Exec "notepad c:\boot.ini"

2、Run不僅可以直接運(yùn)行位于path環(huán)境變量目錄中的程序,還能運(yùn)行在注冊(cè)表App Paths中設(shè)置的程序“別名”。start有此功能。Exec不行,只能直接運(yùn)行位于path環(huán)境變量目錄中的程序。

代碼如下:

ws.Run "iexplore"

'iexplore 在 App Paths 中登記了別名。

ws.Exec "calc"

3、Run可以等待程序運(yùn)行結(jié)束再執(zhí)行下面的命令。start有此功能。Exec不行。

代碼如下:

ws.Run "notepad", ,true

4、Exec運(yùn)行的程序路徑中即使含有空格,也可以不加引號(hào)(參數(shù)如需引號(hào),它的引號(hào)不能省略)。Run、start沒(méi)有這個(gè)本領(lǐng)。(常識(shí):vbs中一個(gè)引號(hào)字符"本身要用兩個(gè)引號(hào)表示,即寫(xiě)成""。也可以用Chr函數(shù)得到引號(hào):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、最大的區(qū)別是:Run著重于啟動(dòng)控制(設(shè)置窗口形式)。(start聽(tīng)名字知道是為了啟動(dòng),也可以簡(jiǎn)單設(shè)置窗口最大化、最小化。)Exec著重于后續(xù)控制,并著重于控制命令行程序。

run可以設(shè)置程序運(yùn)行時(shí)的運(yùn)行模式(前臺(tái)后臺(tái):是否隱藏窗口)、窗口大小、激活狀態(tài)(是否獲取“焦點(diǎn)”),具體參數(shù)請(qǐng)參考手冊(cè)。

Exec在啟動(dòng)程序后還能對(duì)其進(jìn)行控制:獲取運(yùn)行狀態(tài)、獲取PID、強(qiáng)行中止進(jìn)程。如果運(yùn)行的是命令行程序,還能提供對(duì) StdIn/StdOut/StdErr 流的訪(fǎng)問(wèn):寫(xiě)入執(zhí)行命令、獲取命令輸出等。運(yùn)行命令行程序后只能通過(guò)StdIn寫(xiě)入命令,控制臺(tái)窗口不再接受用戶(hù)輸入。

代碼如下:

ws.Run "notepad", 0

'隱藏窗口

ws.Run "notepad", 4

'運(yùn)行后不激活,不打擾原來(lái)的活動(dòng)窗口

注意,手冊(cè)上明確指出,Run不能約束所有程序都按它指定的窗口形式運(yùn)行,有些程序不聽(tīng)它的話(huà),比如iexplore、calc等。運(yùn)行ieplore時(shí),它會(huì)奪取焦點(diǎn)成為活動(dòng)窗口。Run無(wú)法以最小化運(yùn)行calc。

代碼如下:

Set oExec = ws.Exec("mspaint")

WScript.Echo oExec.ProcessId

oExec.Terminate

WScript.Echo oExec.Status '0為運(yùn)行,1為結(jié)束

Set oExec = ws.Exec("ipconfig")

WScript.Echo oExec.StdOut.ReadAll

Exec的應(yīng)用:

1、Runas自動(dòng)輸入密碼:可能是設(shè)計(jì)時(shí)為安全考慮,runas不接收管道傳遞或從文件重定向得到,輸入密碼必須手動(dòng)輸入,這個(gè)問(wèn)題困擾了不少人,卻又難以解決,用Sendkeys也不一定穩(wěn)妥(Demon注:我之前也說(shuō)過(guò)很多次,用Sendkeys是不靠譜的,因?yàn)闊o(wú)法保證目標(biāo)窗口一直獲得焦點(diǎn),但是經(jīng)常見(jiàn)到很多人用,真是不明真相的群眾,悲哀)。如果用Exec方法,就能輕松做到自動(dòng)輸入。

代碼如下:

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的結(jié)合使用:Exec方法無(wú)法隱藏窗口,要得到命令行程序的輸出,就會(huì)有一個(gè)黑呼呼的窗口一閃而過(guò),不僅難看,還會(huì)讓其他使用者誤以為是木馬什么的,很不完美。如何解決這個(gè)問(wèn)題呢?就讓Exec與Run合作吧!

代碼如下:

Set ws = CreateObject("WScript.Shell")

host = WScript.FullName

'Demon注:這里不用這么復(fù)雜吧,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"

'此時(shí)不要用WScript.Echo,因?yàn)楫?dāng)前是在控制臺(tái)運(yùn)行

'WScript.Echo的結(jié)果會(huì)在控制臺(tái)輸出,不會(huì)彈出對(duì)話(huà)框。

vbsRun方法

object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

【參數(shù)】

object 

WshShell 對(duì)象。 

strCommand 

表示要運(yùn)行的命令行的字符串值。包括要傳遞到可執(zhí)行文件的所有參數(shù)。 

intWindowStyle 

可選。表示程序窗口外觀的整數(shù)值。

請(qǐng)注意,并非所有程序都使用此信息。 

bWaitOnReturn 

可選。布爾值,表示在繼續(xù)執(zhí)行腳本中的下一條語(yǔ)句之前,腳本是否等待執(zhí)行完程序。

如果設(shè)為 true,則在執(zhí)行完程序后才執(zhí)行腳本,Run 方法返回由程序返回的任何錯(cuò)誤代碼。

如果設(shè)為 false(默認(rèn)值),則 Run 方法將自動(dòng)在啟動(dòng)程序后立即返回 0(不是錯(cuò)誤代碼)。

【說(shuō)明】

Run 方法返回一個(gè)整數(shù)。Run 方法啟動(dòng)在新 Windows 進(jìn)程中運(yùn)行的程序。

可以讓腳本等到程序執(zhí)行完后再繼續(xù)執(zhí)行。這允許您同步運(yùn)行腳本和程序。

strCommand 參數(shù)內(nèi)的環(huán)境變量自動(dòng)擴(kuò)展。

如果某個(gè)文件類(lèi)型已正確注冊(cè)到某個(gè)程序中,則對(duì)該類(lèi)型的文件調(diào)用 Run 方法時(shí)將執(zhí)行該程序。例如,如果您的計(jì)算機(jī)系統(tǒng)中裝有 Word,則對(duì) *.doc 文件調(diào)用 Run 方法時(shí)將啟動(dòng) Word 并加載該文檔。

【intWindowStyle 說(shuō)明 】

0 隱藏一個(gè)窗口并激活另一個(gè)窗口。 

1 激活并顯示窗口。如果窗口處于最小化或最大化狀態(tài),則系統(tǒng)將其還原到原始大小和位置。第一次顯示該窗口時(shí),應(yīng)用程序應(yīng)指定此標(biāo)志。 

2 激活窗口并將其顯示為最小化窗口。 

3 激活窗口并將其顯示為最大化窗口。 

4 按最近的窗口大小和位置顯示窗口?;顒?dòng)窗口保持活動(dòng)狀態(tài)。 

5 激活窗口并按當(dāng)前的大小和位置顯示它。 

6 最小化指定的窗口,并按照 Z 順序激活下一個(gè)頂部窗口。 

7 將窗口顯示為最小化窗口?;顒?dòng)窗口保持活動(dòng)狀態(tài)。 

8 將窗口顯示為當(dāng)前狀態(tài)?;顒?dòng)窗口保持活動(dòng)狀態(tài)。 

9 激活并顯示窗口。如果窗口處于最小化或最大化狀態(tài),則系統(tǒng)將其還原到原始大小和位置。還原最小化窗口時(shí),應(yīng)用程序應(yīng)指定此標(biāo)志。 

10 根據(jù)啟動(dòng)應(yīng)用程序的程序狀態(tài)來(lái)設(shè)置顯示狀態(tài)。

【示例 1】

下面的 VBScript 代碼用記事本打開(kāi)當(dāng)前運(yùn)行腳本的副本。

代碼如下:

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "%windir%\notepad " & WScript.ScriptFullName

下面的 VBScript 代碼與上述代碼完成的操作相同,不同之處在于,它指定窗口類(lèi)型,等待用戶(hù)關(guān)閉記事本,關(guān)閉記事本時(shí)保存從記事本返回的錯(cuò)誤代碼。

代碼如下:

Set WshShell = WScript.CreateObject("WScript.Shell")

Return = WshShell.Run("notepad " & WScript.ScriptFullName, 1, true)

【示例 2】

下面的 VBScript 代碼打開(kāi)一個(gè)命令窗口,將路徑改為 C:\,并執(zhí)行 DIR 命令。

代碼如下:

Dim oShell

Set oShell = WScript.CreateObject ("WSCript.shell")

oShell.run "cmd /K CD C:\ & Dir"

Set oShell = Nothing

Run 方法:

Run方法有三個(gè)參數(shù),

第一個(gè)參數(shù)是你要執(zhí)行的程序的路徑,

第二個(gè)參數(shù)是窗口的形式,0后臺(tái)運(yùn)行;1正常運(yùn)行;2最小化;3最大化;缺省的話(huà)表示正常運(yùn)行

第三個(gè)參數(shù)是表示這個(gè)腳本是等待還是繼續(xù)執(zhí)行,如果設(shè)為了True,腳本就會(huì)等待調(diào)用的程序退出后再向后執(zhí)行。

例1:

代碼如下:

Set ws = CreateObject("WScript.Shell")

ws.Run "notepad",,True

ws.Run "iexplore"

例2:隱藏BAT執(zhí)行窗口

代碼如下:

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:運(yùn)行文件

代碼如下:

Set ws = CreateObject("WScript.Shell")

ws.Exec "notepad c:/x.txt" ‘對(duì)于Exec應(yīng)指明程序,此notepad是必須的

例2:運(yùn)行程序>獲取進(jìn)程PID值>強(qiáng)行結(jié)束進(jìn)程(沒(méi)有Run+taskkill強(qiáng):如在記事本未保存的情況下結(jié)束進(jìn)程,Exec會(huì)出錯(cuò),而Run不會(huì))>判斷進(jìn)程是否在運(yùn)行(這個(gè)功能不錯(cuò))

代碼如下:

Set ws = CreateObject("WScript.Shell")

Set e = ws.Exec("notepad")

MsgBox e.ProcessId

e.Terminate

WSH.Sleep 1000

MsgBox e.Status ‘0為運(yùn)行,1為結(jié)束

例3:直接獲取dos命令輸出,dos窗口會(huì)閃一下,Exec沒(méi)有窗口控制功能

代碼如下:

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

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:VBS中Run和Exec的區(qū)別
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)