15.6 Windows腳本宿主的內建對象
每個編程環境都提供了自己的對象模型,開發人員 可以使用這些對象模型實現各種解決方案,WSH也不例外。WSH包含了一組核心對象,分別包含了屬性和方法,可以用於訪問網絡中的其他計算機、導入外部的 可腳本化對象以供應用程序使用,或者連接到Windows或Windows Shell。
15.6.1 WScript對象
WSH對象模型的基礎就是WScript對象。這個對象提供了使開發人員能夠訪問各種信息的屬性和方法,如:
● 將要執行的腳本的名稱和路徑信息
● Microsoft腳本引擎的版本
● 與外部對象的鏈接
● 與用戶的交互
● 延遲或中斷腳本執行的能力
1. WScript的屬性
WScript對象具有下列屬性:
● Arguments
● FullName
● Interactive
● Name
● Path
● ScriptFullName
● ScriptName
● StdErr
● StdIn
● StdOut
● Version
Argument
Argument屬性包含了WshArguments對象(一個參數集合)。從該集合中獲取單個參數時,使用由0開始的索引。
Set objArgs = WScript.Arguments
For x = 0 to objArgs.Count - 1
WScript.Echo objArgs(x)
Next
FullName
FullName屬性是一個只讀的字符串,它代表宿主可執行文件(cscript.exe或wscript.exe)的有效完整路徑。下面的代碼使用了FullName屬性。
WScript.Echo WScript.FullName
這段代碼產生如圖15-4的輸出。
圖15-4
Interactive
Interactive屬性設置腳本的模式,或識別腳本的模式。使用該屬性會返回一個布爾值。有兩種可用的模式:批處理模式和交互模式。
在交互模式下(默認情況),腳本可以與用戶進行交互。可以向WSH輸入信息,WSH也可以輸出信息,信息被顯示在對話框中,等待用戶提供反饋。在批處理模式中,不支持用戶交互,不支持WSH的輸入和輸出。
可以使用WSH命令行開關腳本模式//I(交互模式)和//B(批處理模式)來設置腳本模式。
Name
Name屬性返回WScript對象(宿主可執行文件)的名稱,它是一個只讀的字符串。下面的代碼使用了Name屬性:
WScript.Echo WScript.Name
這段代碼產生如圖15-4的輸出。
圖15-5
Path
Path屬性返回包含宿主可執行文件(cscript.exe或wscript.exe)的目錄名。該屬性返回一個只讀的字符串。
下面的VBScript代碼將顯示可執行文件所在的目錄名:
WScript.Echo WScript.Path
ScriptFullName
ScriptFullName屬性返回當前正在運行的腳本的完整路徑。該屬性返回一個只讀的字符串。
ScriptName
ScriptName屬性返回當前正在運行的腳本的文件名。該屬性返回一個只讀的字符串。下面的代碼顯示了正在運行的腳本的名稱,如圖15-6所示:
WScript.Echo WScript.ScriptName
圖15-6
StdErr
StdErr屬性開放當前腳本的只寫的錯誤輸出流。該屬性返回一個標識標準錯誤流的對象。只有使用cscript.exe時才能訪問StdIn、StdOut和StdErr流。使用wscript.exe時如果想訪問這些流就會產生一個錯誤。
StdIn
StdIn屬性開放當前腳本的只讀的輸入流。該屬性返回一個標識標準錯誤流的對象。只有使用cscript.exe時才能訪問StdIn、StdOut和StdErr流。使用wscript.exe時如果想訪問這些流就會產生一個錯誤。
StdOut
StdOut屬性開放當前腳本的只寫的錯誤輸出流。該屬性返回一個標識標準錯誤流的對象。只有使用cscript.exe時才能訪問StdIn、StdOut和StdErr流。使用wscript.exe時如果想訪問這些流就會產生一個錯誤。
下面的示例使用了這三種類型的內建流打印匹配某一特定擴展名的所有文件列表。這是通過將DOS的dir命令結果使用管道重定向到過濾器腳本來實現的,其中將擴展名字符串作爲參數。
' Usage: dir | cscript filter.vbs ext
' ext: file extension to match
'
Dim streamOut, streamIn, streamErr
Set streamOut = WScript.StdOut
Set streamIn = WScript.StdIn
Set streamErr = WScript.StdErr
Dim strExt, strLineIn
Dim intMatch
strExt = WScript.Arguments(0)
intMatch = 0
Do While Not streamIn.AtEndOfStream
strLineIn = streamIn.ReadLine
If 0 = StrComp(strExt, Right(strLineIn, Len(strExt)), _
vbTextCompare) Then
streamOut.WriteLine strLineIn
intMatch = intMatch + 1
End If
Loop
If 0 = intMatch Then
streamErr.WriteLine "No files of type '" & strExt & "' found"
End If
因爲這個示例中使用StdIn、StdOut和 StdErr進行消息的處理,所以不僅能將匹配的文件打印在屏幕上,也能夠將輸出結果發送到一個文本文件或其他有重定向或附加管道功能的應用程序中。例如,可以使用下面的命令創建一個文件,包含整個目錄樹,包括子目錄中的所有.vbs文件:
C:/wsh>dir /s | cscript filter.vbs vbs >> vbsfiles.txt
Version
該屬性返回WSH的版本。下面的代碼顯示當前WSH的版本,如圖15-7所示:
WScript.Echo WScript.Version
圖15-7
2 WScript的方法
WScript對象具有下列方法:
● CreateObject
● ConnectObject
● DisconnectObject
● Echo
● GetObject
● Quit
● Sleep
CreateObject
WScript對象的這個方法用於創建一個COM對象。
object.CreateObject(strProgID[,strPrefix])
● object:WScript對象。
● strProgID:值爲字符串,表示想要創建的對象的程序標識符(ProgID)。
● strPrefix:可選。值爲字符串,表示函數前綴。
使用CreateObject方法和strPrefix參數創建的對象是已連接對象。對象被創建後,其輸出接口與腳本文件相連接。每個事件函數都由這個前綴加上事件的名稱來命名。
如果創建對象時沒有使用strPrefix參數,也可以使用ConnectObject方法同步對象的事件。只要對象產生一個事件,WSH就會調用一個子程序,其名稱是strPrefix加上事件的名稱。
下面的代碼使用CreateObject方法創建一個WshNetwork對象:
Set WshNetwork = WScript.CreateObject("WScript.Network")
ConnectObject
該方法將對象的事件源連接到具有給定前綴的函數。
object.ConnectObject(strObject, strPrefix)
● object:WScript對象。
● strObject:必需的。表示想要連接的對象名稱的字符串。
● strPrefix:必需的。表示函數前綴的字符串。
同步一個對象的事件時,已連接對象是很有用的。對象被創建後,ConnectObject方法將對象的輸出接口連接到腳本文件。事件函數的名稱就是這個前綴加上事件的名稱。
WScript.ConnectObject RemoteScript, "remote_"
DisconnectObject
該方法用於斷開已連接對象的事件源的連接。
object.DisconnectObject(obj)
● object:WScript對象。
● obj:表示想要斷開連接的對象名稱的字符串。
斷開一個對象的連接意味着WSH無法再響應它的事件。但是,有一點很重要,那就是斷開連接後對象仍然能夠產生事件。還要注意的是,如果指定的對象尚未連接,DisconnectObject方法就不會做任何事。
WScript.DisconnectObject RemoteScript
Echo
該方法輸出一個消息框或一個命令控制檯窗口。
object.Echo [Arg1] [,Arg2] [,Arg3] ...
● object:WScript對象。
● Arg1、Arg2、Arg3、……:可選。表示要顯示項目的列表。
根據當前使用的WSH引擎的不同,Echo方法輸出的類型也有所變化(參見表15-3)。
表15-3
WSH引擎 |
文 本 輸 出 |
Wscript.exe |
圖形消息框 |
Cscript.exe |
命令控制檯窗口 |
圖15-8和圖15-9顯示了這兩種輸出的示例。
圖15-8
圖15-9
GetObject
GetObject方法根據指定的ProgID獲取某個已存在對象,或從文件創建一個新的對象。
object.GetObject(strPathname [,strProgID], [strPrefix])
● object:WScript對象。
● strPathname:包含將對象保存到磁盤的文件所使用的完整的有效路徑名。
● strProgID:可選。值爲字符串,表示想要創建的對象的程序標識符(ProgID)。
● strPrefix:可選。進行對象事件同步時有用。如果提供了strPrefix參數,WSH就會在創建對象之後將對象的輸出接口連接到腳本文件。
如果內存中存在對象的一個實例,或者想從文件創建一個對象,都需要使用GetObject方法。GetObject方法適用於所有COM類,與創建對象使用的腳本語言無關。
如果內存不存在對象的實例,也不想從文件創建對象,就可以使用CreateObject方法。
Dim MyObject As Object
Set MyObject = GetObject("C:/DRAWINGS/SCHEMA.DRW")
MyApp = MyObject.Application
Quit
該方法強制腳本在任意時刻立即停止執行。
object.Quit([intErrorCode])
● object:WScript對象。
● intErrorCode:可選。返回一個整數值,作爲進程的返回碼。如果忽略intErrorCode參數,就不會有返回值。
Quit方法可以用於返回一個可選的錯誤代碼。如果Quit方法是腳本中的最後一條命令(並且不需要返回一個非零值),就可以不使用任何參數,這樣腳本就會正常退出。
WScript.Quit 1
' This line of code is not executed.
MsgBox "This message will never be shown!"
下面給出了Quit方法實際運行的示例。
If Err.Number <> 0 Then
WScript.Quit 1 ' some failure indicator Else
WScript.Quit 0 ' success
End If
WScript.Quit 1
Sleep
該方法將腳本的執行掛起一段時間,然後接着執行。
object.Sleep(intTime)
● object:WScript對象。
● intTime:這是一個整數值,表示希望腳本進程保持非活躍狀態的時間間隔(以毫秒爲單位)。
使用這個方法時,運行腳本的線程被掛起,佔用的CPU被釋放。當間隔時間到,就會繼續恢復執行。要想被事件所觸發,腳本必須持續活躍,因爲已經結束執行的腳本是肯定不能檢測到任何事件的。腳本所處理的事件在腳本休眠時仍然會被執行。
向Sleep方法傳遞0或-1作爲參數,就不會導致腳本不確定性地掛起。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "2"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*9"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500
</script>
</job>
</package>
15.6.2 WshArguments對象
編程過程中,參數的使用是一種非常有益的機制,可以給腳本提供輸入以支持它的工作。如果考慮在DOS提示符下工作,那麼多數命令行可執行文件都使用參數來確定要做的事情。例如,瀏覽一個目錄樹:
c:/>cd wsh
在這個例子中,cd是一個DOS命令的名稱(用於切換目錄),而wsh是要激活的目錄的名稱—— 它是作爲參數被傳遞給cd的。
創建使用參數的腳本是編寫可重用代碼的一個良好開端。創建設計用於在命令行中執行的腳本的開發人員會立竿見影地感受到使用Arguments屬性帶來的好處。不過,在WSH中,還有更好的理由來使用這個對象,因爲這就是拖放功能得以實現的原因。
使用這個對象的最後一個好處就是它允許開發人員在其他腳本中重用腳本代碼,只要以命令行運行的方式運行想重用的腳本,並給它傳遞可能在運行時需要的參數即可。
1. 訪問WshArgument對象
它是通過使用WScript.Arguments屬性來實現的。
Set objArgs = WScript.Arguments
2 WshArgument對象的屬性
WshArgument對象是一個由WScript對象的Arguments屬性返回的集合(WScript.Arguments)。
訪問命令行參數集合有下列三種方法:
● 使用WshArguments對象訪問整個參數集合。
● 使用WshNamed對象訪問有名字的參數。
● 使用WshUnnamed對象訪問沒有名字的參數。
下面的例子是一個遍歷WshArguments集合的簡單循環,依次顯示每個元素:
Set objArgs = WScript. Arguments
For x = 0 to objArgs.Count - 1
WScript.Echo objArgs(x)
Next
有趣的是,這段代碼既適用於cscript.exe,也適用於wscript.exe,可以使用示例echoargs.vbs來嘗試這一點。在命令行中運行時,傳遞一些參數:
c:/vbs/echoargs Hello, World!
圖15-10顯示了命令行輸出。
圖15-10
現在可以嘗試拖動一兩個文件,並將它們放到echoargs.vbs上。圖15-11顯示了這樣做輸出的結果。
圖15-11
15.6.3 WshShell對象
Windows腳本宿主提供了一種便捷的方式,可以用於獲取系統環境變量的訪問、創建快捷方式、訪問Windows的特殊文件夾,如Windows Desktop,以及添加或刪除註冊表條目。還可以使用Shell對象的功能創建更多的定製對話框以進行用戶交互。
1 訪問WshShell對象
要使用下面這一節中將要列出的屬性,程序員必須創建一個WScript.Shell對象的實例。這樣以後對WshShell對象的引用實際就是對新創建實例的引用。
Set WshShell= WScript.CreateObject( "WScript.Shell" )
2 WshShell對象的屬性
WshShell對象有三個屬性:
● CurrentDirectory
● Environment
● SpecialFolders
CurrentDirectory
該屬性獲取或更改當前活動目錄。
object.CurrentDirectory
● object:WshShell對象。
CurrentDirectory屬性返回一個字符串,其中包含當前活躍進程的當前工作目錄的完整有效路徑名。
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo WshShell.CurrentDirectory
Environment
該屬性返回WshEnvironment對象(一個環境變量集合)。
object.Environment ([strType])
● object:WshShell對象。
● strType:可選。指定環境變量的位置。
Environment屬性包含WshEnvironment對象(一個環境變量集合)。如果指定了strType,就指定了環境變量所在的級別的值:
● System
● User
● Volatile
● Process
如果沒有指定strType,Environment屬性就會根據不同的操作系統返回不同的環境變量類型(表15-4所示)。
表15-4
環境變量類型 |
操 作 系 統 |
System |
Microsoft Windows NT/2000/XP/Vista |
Process |
Windows 95/98/Me |
對於Windows 95/98/Me,只允許一種strType:Process。其他類型不允許在腳本中使用。
表15-5列出了Windows操作系統提供的一些變量。
表15-5
名 稱 |
描 述 |
System |
User |
Process(NT/2000/XP/Vista) |
Process(95/98/Me) |
NUMBER_OF _PROCESSORS |
機器中運行的處理器個數 |
x |
- |
X |
- |
PROCESSOR _ARCHITECTURE |
用戶工作站的處理器類型 |
x |
- |
X |
- |
PROCESSOR _IDENTIFIER |
用戶工作站的處理器ID |
x |
- |
X |
- |
PROCESSOR _LEVEL |
用戶工作站的處理器等級 |
x |
- |
X |
- |
PROCESSOR _REVISION |
用戶工作站的處理器版本 |
x |
- |
X |
- |
OS |
用戶工作站的操作系統 |
x |
- |
X |
- |
COMSPEC |
用戶工作站的操作系統 |
- |
- |
X |
x |
HOMEDRIVE |
主邏輯驅動器(通常是C盤) |
- |
- |
X |
- |
HOMEPATH |
用戶的默認目錄 |
- |
- |
X |
- |
PATH |
Path環境變量 |
x |
x |
X |
x |
(續表)
名 稱 |
描 述 |
System |
User |
Process(NT/2000/XP/Vista) |
Process(95/98/Me) |
PATHEXT |
可執行文件的擴展名(一般是.com、.exe、.bat或.cmd) |
x |
- |
X |
- |
PROMPT |
命令提示符(一般是$P$G) |
- |
- |
X |
x |
SYSTEMDRIVE |
系統目錄所在驅動器(一般是c:/) |
- |
- |
X |
- |
SYSTEMROOT |
系統目錄(例如c:/winnt)。與WINDIR相同 |
- |
- |
X |
- |
WINDIR |
系統目錄(例如c:/winnt)。與SYSTEMROOT相同 |
x |
- |
X |
x |
TEMP |
存儲臨時文件的目錄(例如c:/temp) |
- |
x |
X |
x |
TMP |
存儲臨時文件的目錄(例如c:/temp) |
- |
x |
X |
x |
要注意的是,腳本有可能訪問其他應用程序所設置的環境變量,而且上面列出的環境變量都不能是Volatile類型的。
下面是一個關於在代碼中如何使用上面列出的這些變量的示例。該示例返回系統中存在的處理器個數。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
SpeciolFolders
該屬性返回一個SpecialFolders對象(一個特殊文件夾集合)。
object.SpecialFolders(objWshSpecialFolders)
● object:WshShell對象。
● onjWshSpecialFolders:特殊文件夾的名稱。
WshSpecialFolders對象是一個集合,它包含所有的Windows特殊文件夾,其中包括Desktop文件夾、Start Menu文件夾和Documents/My Documents文件夾(注意,在Windows Vista中去掉了前綴“my”)。
特殊文件夾的名稱用於索引集合以獲取想要的具體 文件夾。如果被請求的文件夾(strFolderName)不可用,SpecialFolder屬性將返回一個空字符串。例如,Windows 95沒有AllUsersDesktop這個文件夾,所有如果strFolderName是AllUsersDesktop的話,就會返回一個空字符串。
下面是可用的特殊文件夾:
● AllUsersDesktop
● AllUsersStartMenu
● AllUsersPrograms
● AllUsersStartup
● Desktop
● Favorites
● Fonts
● MyDocuments
● NetHood
● PrintHood
● Programs
● Recent
● SendTo
● StartMenu
● Startup
● Templates
下面的代碼用於獲取Start Menu文件夾並在strDeskTop變量中保存路徑以備後面的使用。
strDesktop = WshShell.SpecialFolders("StartMenu")
3. WshShell對象的方法
WshShell對象有11個方法。所有這些方法都與操作系統shell相關,可以用於控制Windows註冊表,也可以創建彈出式消息框和快捷方式以及激活和控制正在運行的應用程序:
● AppActivate
● CreateShortcut
● ExpandEnvironmentStrings
● LogEvent
● Popup
● RegDelete
● RegRead
● RegWrite
● Run
● SendKeys
● Exec
AppActivate
這個方法可以用於激活一個指定的已經打開的應用程序窗口。
object.AppActivate title
● object:WshShell對象。
● title:指定要激活的應用程序。這可以是一個包含應用程序標題的字符串(就像出現在標題欄中的那樣)或應用程序的進程ID。
AppActivate方法返回一個 Boolean類型的值,標誌着過程調用是否成功。這個方法用於將焦點切換至指定名稱的應用程序或窗口。方法的調用不影響應用程序的最大化或最小化狀態。當進行了切換焦點(或關閉窗口)的動作之後,焦點就會從已經獲得焦點的應用程序上移走。
爲了確定要激活的應用程序,指定的標題名稱會與 每個正在運行的應用程序的標題字符串做比較。如果沒有準確的匹配,那麼具有以title所指定的值開始的標題字符串的應用程序就會被激活。如果還是沒有能 找到合適的應用程序,那麼具有以title所指定的值結束的標題字符串的應用程序就會被激活。如果存在多個名爲title所指定的值的應用程序實例,就會任意激活其中的一個。但是,無法控制具體選擇哪一個。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "2"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*3"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500
</script>
</job>
</package>
CreateShortcut
該方法可以用於創建一個新的快捷方式,或打開一個已有的快捷方式。
object.CreateShortcut(strPathname)
● object:WshShell對象。
● strPathname:一個表示要創建的快捷方式的路徑名。
CreateShortcut方法返回一個 WshShortcut對象或一個WshURLShortcut對象。調用CreateShortcut方法不會導致快捷方式的真正創建,而是將快捷方式 對象以及對其所做的修改保存在內存中,直到使用Save方法將其保存至磁盤。要真正創建一個快捷方式,必須完成下列三個步驟:
● 創建WshShortcut對象的一個實例。
● 初始化其屬性。
● 使用Save方法將其保存到磁盤。
容易出問題的是將參數放到快捷方式對象的TargetPath屬性中,這通常是無用的。快捷方式的所有參數都必須放在Arguments屬性中。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & _
"/Shortcut Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut to Notepad"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
</script>
</job>
</package>
ExpandEnvironmentStrings
該方法返回環境變量的擴充值。
object.ExpandEnvironmentStrings(strString)
● object:WshShell對象。
● strString:一個字符串值,表示想要擴充的環境變量的名稱。
這個方法只對PROCESS環境空間內定義的環境變量進行擴充。環境變量的名稱必須以“%”包圍,並且是大小寫不敏感的。
set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "The path to WinDir is " _
& WshShell.ExpandEnvironmentStrings("%WinDir%")
LogEvent
LogEvent方法向日志文件中添加一個事件條目。
object.LogEvent(intType, strMessage [,strTarget])
● object:WshShell對象。
● intType:表示事件類型的整數值。
● strMessage:包含日誌條目文本的字符串值。
● strTarget:可選。一個字符串值,表示事件日誌所存儲的計算機系統名稱(默認的是本地計算機系統)。只適用於Windows NT/2000/XP/Vista。
這個方法用於返回一個Boolean值(如果事 件被成功記錄,就返回True,否則返回False)。在Windows NT/2000/XP/Vista中,事件被記錄在Windows NT Event Log中。在Windows 9x/Me中,事件被記錄在WSH.log(位於Windows目錄)中。
有6種事件類型,如表15-6所示。
表15-6
類 型 |
值 |
0 |
SUCCESS |
1 |
ERROR |
2 |
WARNING |
4 |
INFORMATION |
8 |
AUDIT_SUCCESS |
16 |
AUDIT_FAILURE |
下面的代碼顯示了LogEvent的運行,它基於事件的成功與否對其進行記錄。
Set WshShell = WScript.CreateObject("WScript.Shell")
'assume that rS contains a return code
'from another part of the code
if rS then
WshShell.LogEvent 0, "Script Completed Successfully"
else
WshShell.LogEvent 1, "Script failed"
end if
Popup
該方法用於在彈出式消息框中顯示文本。
intButton = object.Popup(strText,[nSecondsToWait],[strTitle],[nType])
● object:WshShell對象。
● strText:一個字符串值,包含了想要顯示在彈出式消息框中的文本。
● nSecondsToWait:可選。一個數值,表示想要彈出式消息框顯示的最長時間(以秒爲單位)。如果nSecondToWait等於0(默認值), 彈出式消息框就一直可見,直到被關閉。如果nSecondToWait大於0,那麼彈出式消息框就在nSecondToWait秒後關閉。
● strTitle:可選。一個字符串值,包含了想要出現在彈出式消息框標題欄中的文本。如果沒有提供strTitle這個參數,彈出式消息框的標題就會被設置爲默認的字符串“Windows Script Host”。
● nType:可選。一個數值,表示想在彈出式消息框中出現的按鈕和圖標的類型。這些決定了消息框的使用場合和用途。nType的功能與Microsoft Win32應用程序編程接口中的MessageBox函數相同。下面的表格顯示了各種值和它們的含義。可以合併列表中不同的值獲得各種不同的結果。
● IntButton:一個整數值,表示關閉消息框時單擊的按鈕的序號,這個值是由Popup方法返回的。
無論使用那種宿主可執行文件(wscript.exe或cscript.exe)運行腳本,都可以使用Popup方法顯示一個消息框。
要以諸如HeBrew或Arabic這樣的RTL語言的格式(從右至左)正確顯示文本,可以在nType參數之前加上h00100000(十進制的1048576)。
按鈕類型
見表15-7。
表15-7
值 |
描 述 |
0 |
顯示OK按鈕 |
1 |
顯示OK和Cancel按鈕 |
2 |
顯示Abort、Retry和Ignore按鈕 |
3 |
顯示Yes、No和Cancel按鈕 |
4 |
顯示Yes和No按鈕 |
5 |
顯示Retry和Cancel按鈕 |
圖標類型
見表15-8。
表15-8
值 |
描 述 |
16 |
顯示終止(Stop Mark)圖標 |
32 |
顯示問號(Question Mark)圖標 |
48 |
顯示歎號(Exclamation Mark)圖標 |
64 |
顯示提示信息(Information Mark)圖標 |
IntButton的返回值代表已單擊的按鈕編號。如果在nSecondsToWait秒之前沒有單擊任何按鈕,inButton就被設置爲-1.
表15-9列出了關閉消息框時所單擊的按鈕的編號。
表15-9
值 |
描 述 |
1 |
OK按鈕 |
2 |
Cancel按鈕 |
3 |
Abort按鈕 |
4 |
Retry按鈕 |
5 |
Ignore按鈕 |
6 |
Yes按鈕 |
7 |
No按鈕 |
下面的代碼顯示了各種消息框按鈕和圖標的使用:
Dim WshShell, BtnCode
Set WshShell = WScript.CreateObject("WScript.Shell")
BtnCode = WshShell.Popup("Do you like this code?", 7, "Quick survey:", 4 + 32)
Select Case BtnCode
case 6 WScript.Echo "Glad to hear it - Thanks!"
case 7 WScript.Echo "I’m sorry you didn’t like it."
case -1 WScript.Echo "Helllloooooooo?"
End Select
RegDelete
該方法從註冊表中刪除一個鍵或其鍵值。
object.RegDelete(strName)
● object:WshShell對象。
● strName:一個字符串值,表示要刪除的註冊表鍵或鍵值的名稱。
如果strName以反斜槓結尾,就可以指定鍵名,如果不使用反斜槓,就可以指定鍵值名。
完整的有效鍵名和鍵值名是以一個根鍵的名稱作爲前綴的。使用RegDelete方法時,也可以使用根鍵名的縮寫形式。
表15-10列出了5種可能使用的根鍵。
表15-10
根 鍵 名 |
縮 寫 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
下面的腳本將創建、讀取並刪除Windows註冊表鍵。高亮的部分是刪除鍵的腳本。
Dim WshShell, bKey
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY"
WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ"
bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/")
WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef")
WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef"
WshShell.RegDelete "HKCU/Software/WROX/VBScript/"
WshShell.RegDelete "HKCU/Software/WROX/"
在修改註冊表設置時,需要特別的小心。對註冊表進行不當的修改可能會導致系統變得不穩定,甚至使其變得完全不可用。如果不瞭解註冊表的內部工作機制,那麼強烈建議在實際操作之前就此問題閱讀一些相關的資料。
RegRead
該方法返回註冊表中一個鍵或鍵值的名稱。
object.RegRead(strName)
● object:WshShell對象。
● strName:一個字符串值,表示想獲得的鍵或鍵值的名稱。
RegRead方法返回的值有5種類型(如表15-11所示)。
表15-11
類 型 |
描 述 |
形 式 |
REG_SZ |
字符串 |
字符串 |
REG_DWORD |
數字 |
整數 |
REG_BINARY |
二進制值 |
整數構成的VBArray |
REG_EXPAND _ SZ |
可擴充字符串(例如%windir%//notepad.exe) |
字符串 |
REG_MULTI_SZ |
字符串數組 |
字符串構成的VBArray |
如果strName以反斜槓結尾,就可以指定鍵名,如果不使用反斜槓,就可以指定鍵值名。
一個鍵值包含三部分:
● 名稱(Name)
● 數據類型(Data Type)
● 值(Value)
如果指定了鍵名(相對於鍵值名來說),RegRead就會返回默認的值。所以要讀取一個鍵的默認值,只要指定鍵的名稱即可。
完整的有效鍵名和鍵值名是以一個根鍵的名稱作爲起始的。使用RegRead方法時,也可以使用根鍵名的縮寫形式。表15-12列出了5種可能使用的根鍵。
表15-12
根 鍵 名 |
縮 寫 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
下面的腳本將創建、讀取並刪除Windows註冊表鍵。高亮的部分是讀取鍵的腳本。
Dim WshShell, bKey
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY"
WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ"
bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/")
WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef")
WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef"
WshShell.RegDelete "HKCU/Software/WROX/VBScript/"
WshShell.RegDelete "HKCU/Software/WROX/"
RegWrtie
該方法可以創建一個新鍵,給現有鍵添加另一個鍵值名(並指定一個值),或修改現有鍵值名的值。
object.RegWrite(strName, anyValue [,strType])
● object:WshShell對象。
● strName:一個字符串值,表示想創建、添加或修改的鍵名、鍵值名或鍵值。
● anyValue:想要創建的新鍵的名稱,或想添加到現有鍵的鍵值名,或想指定給某個現有鍵值名的新鍵值。
● strType:可選。一個表示鍵值數據類型的字符串。
如果strName以反斜槓結尾,就可以指定鍵名,如果不使用反斜槓,就可以指定鍵值名。
RegWrite方法自動將參數anyValue轉換成一個字符串或一個整數,而由strType的值決定其數據類型(是字符串還是整數)。表15-13列出了strType方法的可用選項。
表15-13
轉換至 |
strType |
字符串 |
REG_SZ |
字符串 |
REG_EXPAND_SZ |
整數 |
REG_DWORD |
整數 |
REG_BINARY |
RegWrite方法不支持REG_MULTI_SZ類型。
RegWrite最多寫入一個DWORD或REG_BINARY值,該方法不支持更大的值。完整的有效鍵名和鍵值名是以一個根鍵的名稱作爲起始的。使用RegWrite方法時,也可以使用根鍵名的縮寫形式。表15-14列出了5種可能使用的根鍵。
表15-14
根 鍵 名 |
縮 寫 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
strType的四種可能被指定的數據類型如表15-15所示。
表15-15
類 型 |
描 述 |
形 式 |
REG_SZ |
字符串 |
字符串 |
REG_DWORD |
數字 |
整數 |
REG_BINARY |
二進制值 |
整數構成的VBArray |
REG_EXPAND _ SZ |
可擴充字符串(例如%windir%//notepad.exe) |
字符串 |
下面的代碼顯示瞭如何訪問和修改Windows註冊表:
Dim WshShell, bKey
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY"
WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ"
bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/")
WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef")
WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef"
WshShell.RegDelete "HKCU/Software/WROX/VBScript/"
WshShell.RegDelete "HKCU/Software/WROX/"
在修改註冊表設置時,需要特別的小心。對註冊表進行不當的修改可能會導致系統變得不穩定,甚至使其變得完全不可用。如果不瞭解註冊表的內部工作機制,那麼強烈建議在實際操作之前就此問題閱讀一些相關的資料。
Run
Run方法在一個新進程中運行一個程序。
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
● object:WshShell對象。
● strCommand:一個字符串,表示想要運行的命令行,必須包含所有要傳遞給可執行文件的參數。
● intWindowStyle:可選。一個整數值,表示程序窗口的外觀。並不是所有的程序都使用這一信息。
● bWaitOnReturn:可選。一個Boolean值,表示腳本在其下一條語句之前是否需要等待程序結束。如果設置爲 True,腳本一直停止執行直到程序結束,Run返回任一個由程序返回的錯誤代碼。如果設置爲False(默認),程序啓動後,Run方法立即返回0(這 不是錯誤代碼)。
Run方法返回一個整數。該方法使用一個新的 Windows進程啓動運行一個程序。可以讓腳本等待程序運行完畢再繼續執行,這樣就可以是腳本和程序同步執行。如果將某個文件類型成功註冊到某一個特定程序,那麼對該文件調用Run方法就會啓動註冊的程序。例如,對一個*.txt文件調用Run方法,就會啓動記事本程序並將文本文件加載到其中。表 15-16列出了intWindowStyle的可用值。
表15-16
IntWindowStyle |
描 述 |
0 |
隱藏當前窗口並激活另一個窗口 |
1 |
激活並顯示一個窗口 如果該窗口處於最小化或最大化狀態,系統將恢復其原始尺寸 如果是初次顯示該窗口,應用程序就應該指定這個標誌 |
2 |
激活並以最小化狀態顯示窗口 |
3 |
激活並以最大化狀態顯示窗口 |
4 |
以其最近位置和尺寸顯示一個窗口 活躍的窗口將繼續保持活躍 |
5 |
以其當前位置和尺寸顯示一個窗口 |
6 |
最小化指定的窗口並將其激活爲Z序列中僅次於頂層的窗口 |
7 |
以最小化形式顯示窗口 活躍的窗口將繼續保持活躍 |
8 |
以其當前狀態顯示窗口 活躍的窗口將繼續保持活躍 |
9 |
激活並顯示窗口 如果該窗口處於最小化或最大化狀態,系統將恢復其原始尺寸 如果要恢復一個最小化窗口,應用程序就應該指定這個標誌 |
10 |
根據啓動應用程序的程序狀態設置窗口顯示的狀態 |
下面的代碼打開一個命令提示符窗口並顯示驅動器C:的內容。
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "cmd /K CD C:/ & Dir"
Set oShell = Nothing
SendKeys
Sendkeys方法向活躍窗口發送一次或多次擊鍵(彷彿來自鍵盤)。
object.SendKeys(string)
● object:WshShell對象。
● string:一個字符串值,表示想要發送的擊鍵。
使用SendKeys方法可以向沒有內建的自動化接口的應用程序發送擊鍵。多數鍵盤字符可由單個擊鍵表示,但有些鍵盤字符是由擊鍵的組合構成的(例如Alt+F4)。
要發送一個單獨的鍵盤字符,只要將該字符本身作爲字符串參數發送即可。例如,要發送字母“v”。要發送一個空格,可以發送“ ”。
也可以使用SendKeys方法發送多次擊鍵。可以依次加入每次擊鍵,形成一個序列,創建一個複合的字符串參數來表示擊鍵的序列。例如,要發送擊鍵x、y和z,可以發送字符串參數“xyz”
SendKeys方法使用某些字符作爲其他字符的限定符。這些特殊的字符包括圓括弧、尖括弧、花括弧,以及表15-17中列出的一些字符。
表15-17
加號 |
+ |
上尖角 |
^ |
百分號 |
% |
波浪號 |
~ |
要發送這些字符,可以將它們包含在一對花括弧“{}”中間。所以如果要發送加號,可以發送字符串參數“{+}”。
在SendKeys中使用方括弧“[]”時,沒有什麼特殊含義,但爲了滿足那些爲它們指定了特殊含義的應用程序(例如Dynamic Data Exchange)的需要,仍需要將它們包含在花括弧中。
要發送方括弧字符,可以使用字符串數組“{[}”發送左括弧,使用字符串數組“{]}”發送右括弧。要發送花括弧字符,可以發送字符串參數“{{}”發送左括弧,發送字符串“{}}”發送右括弧。
某些擊鍵不產生任何字符(如Enter和Tab),某些擊鍵代表一些動作(如Backspace和Break)。要發送這些擊鍵,可以發送表15-18中列出的這些字符串參數。
表15-18
Backspace |
{BACKSPACE}, {BS}, or {BKSP} |
Break |
{BREAK} |
(續表)
Caps Lock |
{CAPSLOCK} |
Del or Delete |
{DELETE} or {DEL} |
Down Arrow |
{DOWN} |
End |
{END} |
Enter |
{ENTER} or ~ |
Esc |
{ESC} |
Help |
{HELP} |
Home |
{HOME} |
Ins or Insert |
{INSERT} or {INS} |
Left Arrow |
{LEFT} |
Num Lock |
{NUMLOCK} |
Page Down |
{PGDN} |
Page Up |
{PGUP} |
Print Screen |
{PRTSC} |
Right Arrow |
{RIGHT} |
Scroll Lock |
{SCROLLLOCK} |
Tab |
{TAB} |
Up Arrow |
{UP} |
F1 |
{F1} |
F2 |
{F2} |
F3 |
{F3} |
F4 |
{F4} |
F5 |
{F5} |
F6 |
{F6} |
F7 |
{F7} |
F8 |
{F8} |
F9 |
{F9} |
F10 |
{F10} |
F11 |
{F11} |
F12 |
{F12} |
F13 |
{F13} |
F14 |
{F14} |
F15 |
{F15} |
F16 |
{F16} |
要發送常規字符與Shift、Ctrl或Alt鍵的組合,就需要創建一個複合的字符串參數以表示這種擊鍵組合。可以在常規擊鍵之前加上表15-19中的一個或多個特殊字符。
表15-19
鍵 |
特 殊 字 符 |
Alt |
% |
Ctrl |
^ |
Shift |
+ |
當用做這種用途時,這些特殊字符不需要被包含在花括弧中。
要表示按下其他某些鍵的同時,必須按下Shift、Ctrl或Alt鍵的情況,可以修改圓括弧中包含的擊鍵序列創建一個複合的字符串參數。例如下面這些擊鍵以及相應的操作:
● 按下Shift的同時按下V和B,發送字符串參數“+(VB)”。
● 按下Shift的同時按下V,然後長按B(不要按下Shift),發送字符串參數“+VB”。
可以使用SendKeys方法發送一個單獨的擊 鍵被按下若干次所構成的擊鍵模式。可以創建一個複合的字符串參數,指定想要重複的擊鍵,後面再跟上想要重複的次數。使用的複合字符串參數形如{擊鍵 次數}。例如,要發送“V”被按下10次的擊鍵模式,可以發送字符串參數“{V 10}”。
單個擊鍵被按下若干次的模式是唯一的一種能夠發送的擊鍵模式。例如,可以發送10次“V”,但不能發送10次“Ctrl+V”。注意,不能嚮應用程序發送Print Screen鍵{PRTSC}。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "2"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*9"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500
</script>
</job>
</package>
Exec
Exec方法在一個子命令解釋器中運行一個應用程序,子命令解釋器提供對StdIn、StdOut和StdErr流的訪問。
object.Exec(strCommand)
● object:WshShell對象。
● strCommand:一個字符串值,表示用於運行腳本的命令行。
Exec方法返回一個WshScriptExec對象,該對象提供使用Exec運行的腳本的狀態和錯誤信息,也提供對StdIn、StdOut和StdErr通道的訪問。Exec方法只能執行命令行應用程序,並且不能用於運行遠程腳本。
15.6.4 WshNamed對象
WshNamed對象提供從命令行中對有名稱參數的訪問。
WshArguments對象的Named屬性返回WshNamed對象,這是一個有名稱參數的集合。這個集合使用了參數名稱作爲索引來獲取每個參數的值。訪問命令行參數集合有下列三種方法:
● 使用WshAruments對象訪問整個參數集合。
● 使用WshNamed對象訪問有名字的參數。
● 使用WshUnnamed對象訪問沒有名字的參數。
1. 訪問WshNamed對象
該對象的訪問是通過創建WScript.Named對象的實例實現的。
Set argsNamed = WScript.Arguments.Named
2. WshNamed對象的屬性
WshNamed對象具有兩個屬性:
● Item
● Length
Item
Item屬性提供了對WshNamed對象中的項目的訪問。
Object.Item(key)
● object:WshNamed對象。
● key:想要獲取的項目名稱。
Item屬性返回一個字符串。對於集合來說,它根據給定的關鍵字返回一個項目。在命令行中輸入參數時,可以在字符串中使用空格,只要將其包含在引號中即可。下面這行代碼可以用於在命令提示符下運行腳本:
sample.vbs /a:arg1 /b:arg2
如果腳本中包含下面的代碼。
WScript.Echo WScript.Arguments.Named.Item("b")
WScript.Echo WScript.Arguments.Named.Item("a")
就會產生這樣的輸出結果。
arg2
arg1
Length
Length屬性是一個只讀的整數,可以在編寫Jscript腳本時使用。同樣地,這個屬性不在本書的討論範圍之內。
3. WshNamed對象的方法
WshNamed對象具有兩個方法:
● Count
● Exists
Count
Count方法返回WshNamed或WshUnnamed對象的選項開關個數。
object.Count
● object:WshNamed對象。
Count方法用於返回一個整數值。該方法是給VBScript用戶使用的,JScript用戶應該使用length屬性。
For x = 0 to WScript.Arguments.Count-1
WScript.Echo WScript.Arguments.Named(x)
Next x
Exists
Exists方法可以用於確定某一給定的鍵值是否存在於WshNamed對象中。
object.Exists(key)
● object:WshNamed對象。
● key:字符串值,表示WshNamed對象的一個參數。
這個方法返回一個Boolean值。如果請求的參數的確在命令行中被指定,就返回True(否則返回False)。在命令提示符中輸入下面的代碼運行腳本:
sample.vbs /a:arg1 /b:arg2
下面的代碼可以用於確定是否使用了參數/a、/b和/c:
WScript.Echo WScript.Arguments.Named.Exists("a")
WScript.Echo WScript.Arguments.Named.Exists("b")
WScript.Echo WScript.Arguments.Named.Exists("c")
15.6.5 WshUnnamed對象
WshUnnamed對象提供了從命令行中對未命名對象的訪問。它是一個由WshAruments對象的Unnamed屬性返回的只讀集合。從該集合中獲取單個參數值時,使用由0開始的索引。
訪問命令行參數集合有下列三種方法:
● 使用WshAruments對象訪問整個參數集合。
● 使用WshNamed對象訪問有名字的參數。
● 使用WshUnnamed對象訪問沒有名字的參數。
1. 訪問WshUnnamed對象
該對象的訪問是通過創建WScript.Arguments.Unnamed對象的實例實現的。
Set argsUnnamed = WScript.Arguments.Unnamed
2. WshUnnamed對象的屬性
WshUnnamed對象具有兩個屬性:
● Item
● Length
這兩個屬性和WshNamed的類似,這裏就不再重複介紹。
3. WshUnnamed對象的方法
WshUnnamed對象具有一個方法:
● Count
這個方法和WshNamed的類似,這裏就不再重複介紹。
15.6.6 WshNetwork對象
WshNetwork對象提供對計算機所連接的網絡上共享資源的訪問。如果想連接到網絡共享或網絡打印機,從網絡共享或網絡打印機斷開連接,映射或刪除網絡共享,或訪問網絡上某一用戶的信息,都需要創建一個WshNetwork對象。
1. 訪問WshNetwork對象
該對象的訪問是通過創建WScript.Network對象的實例實現的。
Set WshNetwork = WScript.CreateObject("WScript.Network")
2. WshNetwork對象的屬性
WshNetwork對象具有三個屬性:
● ComputerName
● UserDomain
● UserName
ComputerName
ComputerName屬性返回計算機系統的名稱。
object.ComputerName
● object:WshNetwork對象。
ComputerName屬性包含一個字符串值,表示計算機系統的名稱。
<package>
<job id="vbs">
<script language="VBScript">
Set WshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & WshNetwork.UserDomain
WScript.Echo "Computer Name = " & WshNetwork.ComputerName
WScript.Echo "User Name = " & WshNetwork.UserName
</script>
</job>
</package>
UserDomain
UserDomain屬性返回用戶的域名。
object.UserDomain
● object:WshNetwork對象。
UserDomain屬性在Windows 98和Windows Me下不可用,除非設置了USERDOMAIN環境變量。這個變量默認情況下是沒有被設置的。
<package>
<job id="vbs">
<script language="VBScript">
Set WshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & WshNetwork.UserDomain
WScript.Echo "Computer Name = " & WshNetwork.ComputerName
WScript.Echo "User Name = " & WshNetwork.UserName
</script>
</job>
</package>
UserName
UserName屬性返回某個用戶的名稱。
object.UserName
● object:WshNetwork對象。
UserName屬性以字符串返回一個用戶的名稱。
<package>
<job id="vbs">
<script language="VBScript">
Set WshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & WshNetwork.UserDomain
WScript.Echo "Computer Name = " & WshNetwork.ComputerName
WScript.Echo "User Name = " & WshNetwork.UserName
</script>
</job>
</package>
3. WshNetwork的方法
WshNetwork對象有下列8個方法可用:
● AddWindowsPrinterConnection
● AddPrinterConnection
● EnumNetworkDrives
● EnumPrinterConnection
● MapNetworkDrive
● RemoveNetworkDrive
● RemovePrinterConnection
● SetDefaultPrinter
AddWindowsPrinterConnection
AddWindowsPrinterConnection方法在計算機系統中添加一個Windows打印機連接。
● Windows NT/2000/XP/Vista:
object.AddWindowsPrinterConnection(
strPrinterPath
)
● Windows 9x/Me:
object.AddWindowsPrinterConnection(
strPrinterPath,
strDriverName[,strPort]
)
• object:WshNetwork對象。
• strPrinterPath:一個字符串值,表示打印機連接的路徑。
• strDriverName:一個字符串值,表示驅動器的名稱(在Windows NT/2000/XP中忽略此參數)。
• strPort:可選。一個字符串值,爲打印機連接指定一個打印機端口(在Windows NT/2000/XP系統中忽略此參數)。
● 使用這個方法添加一個打印機連接和使用控制面板中的Printer選項是非常類似的。這個方法允許創建一個打印機連接,並且能夠很方便地將其定向到某一特定端口。
● 如果連接失敗,就會產生一個錯誤。
Set WshNetwork = WScript.CreateObject("WScript.Network")
PrinterPath = "//printerserver/DefaultPrinter"
WshNetwork.AddWindowsPrinterConnection PrinterPath
AddPrinterConnection
AddPrinterConnection方法在計算機系統中添加一個遠程打印機連接。
object.AddPrinterConnection(strLocalName,
strRemoteName[,bUpdateProfile][,strUser][,strPassword])
● object:WshNetwork。
● strLocalName:一個字符串值,表示指派給以連接打印機的本地名稱。
● strRemoteName:一個字符串值,表示遠程打印機的名稱。
● bUpdateProfile:可選。一個Boolean值,表示打印機映射是否被存儲到當前用戶的參數文件中。如果提供了bUpdateProfile參數並且值爲True,打印機映射就會被存儲到用戶參數文件中。默認值爲False。
● strUser:可選。一個字符串值,表示用戶名。如果使用某個其他用戶,而非當前用戶的參數文件映射一個遠程的打印機,就可以指定strUser和strPassword。
● strPassword:可選。一個字符串值,表示用戶的密碼。如果使用某個其他用戶,而非當前用戶的參數文件映射一個遠程的打印機,就可以指定strUser和strPassword。
EnumNetworkDrives
EnumNetworkDrives方法返回當前網絡驅動器的映射信息。
objDrives = object.EnumNetworkDrives
● object:WshNetwork對象。
● objDrives:一個變量,保存網絡驅動器的映射信息。
這個方法返回一個集合,它是一個由關聯項目對(網絡驅動器本地名稱與其關聯的UNC(Universal Naming Convention,通用命名規範)名稱)構成的數組。集合中的偶數元素表示邏輯驅動器的本地名稱,而奇數元素表示其關聯的UNC共享名。
集合中的第一個元素的索引是0。
EnumPrinterConnection
EnumPrinterConnection方法返回當前網絡打印機的映射信息。
objPrinters = object.EnumPrinterConnections
● object:WshNetwork對象。
● objPrinters:保存網絡打印機的映射信息的變量。
EnumPrinterConnection方法返回一個集合,它是一個由關聯項目對(網絡打印機本地名稱與其關聯的UNC(Universal Naming Convention,通用命名規範)名稱)構成的數組。集合中的偶數元素表示打印機端口,而奇數元素表示網絡打印機的UNC名稱。
集合中的第一個元素的索引是0。
MapNetworkDrive
MapNetworkDrive方法在計算機系統中添加一個共享網絡驅動器。
object.MapNetworkDrive(strLocalName, strRemoteName, [bUpdateProfile],
[strUser], [strPassword])
● object:WshNetwork對象。
● strLocalName:一個字符串值,表示被映射驅動器在本地的名稱。
● strRemoteName:一個字符串值,表示共享的UNC名稱(//xxx/yyy)。
● bUpdateProfile:可選。一個Boolean值,表示映射信息是否被存儲到當前用戶的參數文件中。如果提供了bUpdateProfile參數並且值爲True,映射信息就會被存儲到用戶參數文件中。默認值爲False。
● strUser:可選。一個字符串值,表示用戶名。如果使用某個其他用戶,而非當前用戶的憑證映射一個網絡驅動器,就必須指定這個參數。
● strPassword:可選。一個字符串值,表示用戶的密碼。如果使用某個其他用戶,而非當前用戶的憑證映射一個網絡驅動器,就必須指定這個參數。
如果試圖映射一個非共享的網絡驅動器,就會導致一個錯誤。
RemoveNetworkDrive
RemoveNetworkDrive方法在計算機系統中刪除一個共享的網絡驅動器。
object.RemoveNetworkDrive(strName, [bForce], [bUpdateProfile])
● object:WshNetwork對象。
● strName:一個字符串值,表示想要刪除的已映射驅動器名稱。strName參數既可以是一個本地名稱,也可以是遠程名稱,這取決對於驅動器映射的方式。
● bForce:可選。一個Boolean值,表示是否強制刪除已映射的驅動器。如果指定了bForce參數並且其值爲True,那麼無論資源是否正在被使用,該方法都會刪除連接。
● bUpdateProfile:可選。一個Boolean值,表示是否從用戶參數文件中刪除映射信息。如果指定了bUpdateProfile參數並且其值爲True,就會從用戶參數文件中刪除映射信息。bUpdateProfile默認值爲False。
如果某驅動器存在從本地名稱(驅動器字母)到遠程名稱(UNC名稱)的映射,strName就必須被設置爲本地名。如果網絡路徑沒有本地名稱映射,strName就必須被設置爲遠程名稱。下面的腳本刪除網絡驅動器“G:”。
Dim WshNetwork
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.RemoveNetworkDrive "G:"
RemovePrinterConnection
RemovePrinterConnection方法在計算機系統中刪除一個共享的網絡打印機連接。
object.RemovePrinterConnection(strName, [bForce], [bUpdateProfile])
● object:WshNetwork對象。
● strName:一個字符串值,表示打印機的標識名稱。它可以是一個UNC名稱(格式爲//xxx/yyy)或者一個本地名稱(如LPT1)。
● bForce:可選。一個Boolean值,表示是否強制刪除已映射的打印機。如果指定了bForce參數並且其值爲True,那麼無論是否有用戶正在連接,該方法都會刪除打印機連接。
● bUpdateProfile:可選。一個Boolean值,如果設置爲True(默認是False),所做的更改保存到用戶參數文件中。
RemovePrinterConnection方法將同時刪除基於Windows和基於DOS的打印機連接。
如果打印機是使用AddPrinterConnection方法連接的,strName就必須是打印機的本地名稱。
如果打印機是使用AddWindowsPrinterConnection方法或手工連接的,strName就必須是打印機的UNC名稱。
SetDefaultPrinter
SetDefaultPrinter方法將某個遠程打印機指定爲默認打印機。
object.SetDefaultPrinter(strPrinterName)
● object:WshNetwork對象。
● strPrinterName:一個字符串值,表示遠程打印機的UNC名稱。
使用基於DOS的打印機連接時,SetDefaultPrinter方法調用將失敗。此外,也不能使用SetDefaultPrinter方法確定當前已安裝的默認打印機名稱。
15.6.7 WshEnvironment對象
WshEnvironment對象提供對Windows環境變量集合的訪問。
這個對象是一個由WshShell對象的Environment屬性返回的環境變量集合。該集合包含全部的環境變量(包括有名稱的和沒有名稱的)。
要獲取集合中某個具體的環境變量(及其值),可以使用環境變量名作爲索引。
1. 訪問WshEnvironment對象
該對象的訪問是通過創建WScript.Environment對象的實例實現的。下面的腳本返回運行腳本的系統中安裝的處理器個數:
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
2. WshEnvironment對象的屬性
WshEnvironment對象具有兩個屬性:
● Item
● Length
Item
Item屬性公開集合中的某一指定元素。
Object.Item(natIndex)
● object:EnumNetworkDrive或numPrinterConnections方法的返回值,或由Environment或SpecialFolders屬性返回的對象。
● natIndex:設置要獲取的元素。
Item是每個集合的默認屬性。對於EnumNetworkDrive和EnumPrinterConnections集合來說,索引是一個整數,但對於Environment和SpecialFolders來說,索引是一個字符串。
在VBScript中,如果請求的文件夾(strFolderName)不存在,WshShell.SpecialFolders.Item (strFolderName)將返回“Empty”。
<package>
<job id="vbs">
<script language="VBScript">
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSpecialFolders = WshShell.SpecialFolders
For x = 0 To WshSpecialFolders.Count - 1
WScript.Echo WshSpecialFolders.Item(x)
Next
</script>
</job>
</package>
Length
Length屬性是一個只讀的整數,可以在編寫Jscript腳本時使用。同樣地,這個屬性不在本書的討論範圍之內。
3. WshEnvironment對象的方法
WshEnvironment對象具有兩個方法:
● Count
● Remove
Count
Count方法返回一個Long值,表示集合中元素的個數。
object.Count
● object:Arguments對象
Count方法返回一個整數值。該方法是給VBScript用戶使用的,JScript用戶應該使用Length屬性。
For x = 0 to WScript.Arguments.Count-1
WScript.Echo WScript.Arguments.Named(x)
Next x
Remove
Remove方法刪除一個現有的環境變量。
object.Remove(strName)
● object:WshEnvironment對象。
● strName:一個字符串值,表示要刪除的環境變量的名稱。
Remove方法刪除下列類型的環境變量:
● PROCESS
● USER
● SYSTEM
● VOLATILE
使用Remove方法刪除的環境變量將在當前會話結束後被恢復。
Dim WshShell, WshEnv
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("PROCESS")
WshEnv("tVar") = "VBScript is Cool!"
WScript.Echo WshShell.ExpandEnvironmentStrings("The value of the test variable is:
'%tVar%’")
WshEnv.Remove "tVar"
WScript.Echo WshShell.ExpandEnvironmentStrings("The value of the test variable is:
'%tVar%’")
15.6.8 WshSpecialFolders對象
WshSpecialFolders對象提供對Windows特殊文件夾集合的訪問。
WshShell對象的SpecialFolder屬性返回WshSpecialFolders對象。該集合包含對Windows特殊文件夾(例如,Desktop文件夾和Start menu文件夾)的引用。
從這個集合中可以使用某特殊文件夾的名稱作爲索引獲取該文件夾的路徑。一個特殊文件夾的路徑依賴於用戶環境。如果一臺計算機上有多個用戶,那麼硬盤上就存有若干組特殊文件夾。下面列出了可用的特殊文件夾:
● AllUsersDesktop
● AllUsersPrograms
● AllUsersStartMenu
● AllUsersStartup
● Desktop
● Favorites
● Fonts
● MyDocuments
● NetHood
● PrintHood
● Programs
● Recent
● SendTo
● StartMenu
● Startup
● Templates
下面的代碼演示瞭如何在Windows桌面上創建Windows Notepad的一個快捷方式:
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "A Script Generated Shortcut to Notepad"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
</script>
</job>
</package>
1. WshSpecialFolders對象的屬性:Item
WshSpecialFolders對象具有一個屬性:
● Item
Item屬性暴露集合中某一指定的元素。
Object.Item(natIndex)
● Object:EnumNetworkDrive或EnumPrinterConnections方法的返回結果,或Environment 或SpecialFolders屬性返回的對象。
● natIndex:設置想要獲取的元素。
Item是每個集合都有的默認屬性。對於EnumNetworkDrive和EnumPrinterConnections集合來說,索引是整數,但對於Environment和SpecialFolders集合來說,索引是字符串。
<package>
<job id="vbs">
<script language="VBScript">
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSpecialFolders = WshShell.SpecialFolders
For x = 0 To WshSpecialFolders.Count - 1
WScript.Echo WshSpecialFolders.Item(x)
Next
</script>
</job>
</package>
2 WshSpecialFolders對象的方法:Count
WshSpecialFolders對象具有一個方法:
● Count
Count方法返回WshNamed對象或WshUnnamed對象的開關數。
object.Count
● object:Arguments對象。
Count方法返回一個整數值。Count方法適用於VBScript用戶,JScript用戶應該使用Length屬性。
15.6.9 WshShortcut對象
WshShortcut對象允許您使用腳本創建快捷方式。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut
Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
</script>
</job>
</package>
1. WshShortcut對象的屬性
WshShortcut對象具有8個屬性:
● Arguments
● Description
● FullName
● Hotkey
● IconLocation
● TargetPath
● WindowStyle
● WorkingDirectory
Arguments
Arguments屬性包含WshArguments對象(一個參數集合)。從該集合中獲取單個參數值時,使用由0開始的索引。
Set objArgs = WScript.Arguments
For x = 0 to objArgs.Count - 1
WScript.Echo objArgs(x)
Next
Description
Description屬性返回快捷方式的描述信息。
object.Description1
● Object:WshShortcut對象。
Description屬性包含一個描述快捷方式的字符串值。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut
Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Script generated shortcut to Notepad"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
</script>
</job>
</package>
FullName
FullName屬性返回快捷方式對象目標的有效完整路徑。
object.FullName
● Object:WshShortcut對象。
FullName屬性包含一個只讀字符串,給出了快捷方式目標的有效完整路徑。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut
Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
HotKey
HetKey屬性用於給快捷方式指定一個熱鍵,或識別快捷方式的熱鍵。一個快捷方式的熱鍵是指一些按鍵的組合,當同時按下這些按鍵時,就會啓動該快捷方式。
object.Hotkey = strHotkey
● Object:WshShortcut對象。
● strHotkey:一個字符串,表示指定給快捷方式的熱鍵。
下面是strHotkey的語法:
[KeyModifier]KeyName
● KeyModifier:KeyModifier可以是這些鍵之一:Alt+、Ctrl+、Shift+、Ext+。
Ext+指的是“擴展鍵”。這個鍵的加入是爲了將來可能會在字符集中加入一類新的Shift鍵。
KeyName- a ... z, 0 ... 9, F1 ... F12, ...
KeyName是大小寫不敏感的。
修改前面的代碼,添加一個熱鍵,如下。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
IconLocation
IconLocation屬性用於給快捷方式指定一個圖標,或識別快捷方式的圖標。
object.IconLocation = strIconLocation
● Object:WshShortcut對象。
● strIconLocation:一個字符串,指定要使用的圖標。該字符串應該包含圖標的一個有效的完整路徑,以及該圖標所關聯的一個索引。如果有多個圖標,可以使用索引選擇其中的一個。索引起始於0。
修改先前的代碼,給快捷方式指定一個標準的Notepad圖標。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
TargetPath
TargetPath屬性給出了快捷方式執行文件的路徑。
object.TargetPath
● Object:WshShortcut或WshUrlShortcut對象。
這個屬性只用於快捷方式的目標路徑,其他所有的參數必須放在Argument的屬性中。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut
Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
WindowsStyle
Windowstyle屬性用於指定快捷方式的窗口類型,或識別快捷方式所使用的窗口類型。
object.WindowStyle = intWindowStyle
● Object:WshShortcut對象。
● intWindowStyle:設置程序執行窗口的類型。
WindowStyle屬性返回一個整數。
表15-20列出了intWindowStyle的可用值。
表15-20
intWindowStyle |
描 述 |
1 |
激活並顯示一個窗口 如果該窗口處於最小化或最大化狀態,系統將恢復其原始尺寸 如果是初次顯示該窗口,應用程序就應該指定這個標誌 |
3 |
激活並以最大化狀態顯示窗口 |
7 |
以最小化形式顯示窗口 活躍的窗口將繼續保持活躍 |
下面代碼中的改動保證Notepad窗口處於活躍狀態。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
WorkingDirectory
WorkingDirectory屬性用於指定快捷方式的工作目錄,或識別快捷方式所使用的工作目錄。
object.WorkingDirectory = strWorkingDirectory
● Object:WshShortcut對象。
● strWorkingDirectory:一個字符串,表示快捷方式的起始目錄。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "notepad.exe, 0"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
WScript.Echo oShellLink.FullName
</script>
</job>
</package>
2. WshShortcut對象的方法
WshShortcut對象具有一個方法:
● Save
Save方法將一個快捷方式保存到磁盤。
object.Save
● Object:WshShortcut或WshUrlShortcut對象。
使用CreateShortcut方法創建一個快捷方式並設置該快捷方式對象的屬性後,可以使用Save方法將該快捷方式對象保存到硬盤上。Save方法使用快捷方式對象的FullName屬性中的信息確定在硬盤上保存快捷方式對象的位置。
只能對系統對象創建快捷方式—— 文件、目錄和磁盤驅動器。不能爲打印機或調度任務創建快捷方式。
15.6.10 WshUrlShortcut對象
WshUrlShortcut對象允許您使用腳 本創建到Internet資源的快捷方式。該對象是WshShell對象的子對象。必須使用WshShell方法的CreateShortcut來創建 WshUrlShortcut對象。下面的代碼可以保存爲一個後綴名爲.wsf的Windows腳本文件。
WshShell.CreateShortcut(strDesktop & "/URLShortcut.lnk")
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url")
oUrlLink.TargetPath = "http://www.wrox.com"
oUrlLink.Save
</script>
</job>
</package>
1. WshUrlShortcut對象的屬性
WshUrlShortcut對象具有兩個屬性:
● FullName
● TargetPath
FullName
FullName屬性返回快捷方式對象目標的有效完整路徑。
object.FullName
● Object:WshUrlShortcut對象。
FullName屬性包含一個只讀的字符串,給出快捷方式目標的有效的完整路徑。下面的代碼可以保存爲一個後綴名爲.wsf的Windows腳本文件。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url")
oUrlLink.TargetPath = "http://www.wrox.com"
oUrlLink.Save
WScript.Echo oUrlLink.FullName
</script>
</job>
</package>
TargetPath
TargetPath屬性給出了快捷方式可執行文件的路徑。
object.TargetPath
● Object:WshUrlShortcut對象。
這個屬性只用於快捷方式的目標路徑,其他所有的參數必須放在Argument的屬性中。下面的代碼可以保存爲一個後綴名爲.wsf的Windows腳本文件。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url")
oUrlLink.TargetPath = "http://www.wrox.com"
oUrlLink.Save
WScript.Echo oUrlLink.FullName
</script>
</job>
</package>
2. WshUrlShortcut對象的方法
WshUrlShortcut對象具有一個方法:
● Save
Save方法將快捷方式對象保存到磁盤。
object.Save
● Object:WshUrlShortcut對象。
使用CreateShortcut方法創建一個 快捷方式並設置該快捷方式對象的屬性後,可以使用Save方法將該快捷方式對象保存的硬盤上。Save方法使用快捷方式對象的FullName屬性中的信 息確定在硬盤上保存快捷方式對象的位置。下面的代碼可以保存爲一個後綴名爲.wsf的Windows腳本文件。
<package>
<job id="vbs">
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url")
oUrlLink.TargetPath = "http://www.wrox.com"
oUrlLink.Save
WScript.Echo oUrlLink.FullName
</script>
</job>
</package>
15.2 WSH的概念
WSH是一個Windows管理工具。WSH創建了一個腳本運行的主環境,當腳本到達一臺計算機時,WSH扮演主人的角色。WSH使腳本能夠使用對象和服務,並提供腳本執行的準則。此外,WSH還負責安全管理以及調用適當的腳本引擎。
因爲WSH是與腳本語言無關的,所以它還提供了 使用JScript、Perl、Python、REXX,或其他ActiveX腳本編寫語言(只有VBScript和JScript是Microsoft 提供的,其他ActiveX腳本引擎是由第三方提供的)進行腳本編寫的機制。WSH提供了一些非常便於使用的工具,可以訪問散佈在網絡中,運行各種風格的 Windows操作系統的機器,從而提供了網絡管理的能力。這種訪問大部分是通過活動目錄服務接口(Active Directory Service Interface,ADSI)和Windows管理規範(Windows Management Instrumentation,WMI)實現的。ADSI提供了一套COM接口,可以用於多種目錄服務,如輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP)、Windows NT目錄服務,以及Novell的Netware和NDS服務。WMI是Microsoft基於Web的企業管理(Web-Based Enterprise Management,WBEM)的實現,這種標準的方法可以訪問管理信息,如指定的客戶端上安裝的應用程序、系統內存,以及其他客戶端信息。
通過開發使用ADSI和WMI的WSH腳本,系統管理員可以開發腳本以便執行下面列出的這些以及其他更多任務:
● 訪問並操作服務器
● 添加或刪除用戶以及修改密碼
● 添加網絡文件共享
目前的WSH版本是5.7,它是隨Windows Vista一起發佈的。該版本相對於先前的版本(2.0)來說具有很多顯著的變化。目前發佈的WSH包含了大量深受程序員喜愛的功能:
● 支持文件包含
● 能夠在同一腳本中使用多種語言
● 支持拖放功能
● 參數處理
● 可以遠程運行腳本
● 增強對外部對象和類型庫的訪問
● 更強的調試功能
● 暫停腳本執行的機制(對於接收受控對象產生的事件來說非常有用)
● 標準的輸入/輸出以及標準的錯誤支持(只有在控制檯模式下運行cscript.exe時纔有用)
● 可以將新的進程作爲對象來對待
● 對當前工作目錄的訪問
● 新改進的安全模型
隨Windows Vista發佈的版本5.7中包括針對版本5.6的bug和安全性修正。
WSH 1.0的運行機制比較簡單,只是爲VBScript的文件擴展名(.vbs)和JScript的文件擴展名(.js)關聯相應的腳本宿主。這意味着如果雙擊一個腳本文件,就會自動執行它。但是,這有一個很重要的侷限—— 關聯模式不允許使用代碼模塊,也不允許在一個WSH腳本項目中使用多種腳本語言。爲了滿足各種程序員的需要,Microsoft在WSH 2.0中引入了一種新的腳本文件類型(.wsf),它利用一種XML語法提供前面所提到的很多新的功能。
這種新的機制在其他的標記中包含了<script>標記、<object>標記和<job>標記。在這一章後面的部分中,我們將介紹具體的運行機制。
文件擴展名.wsf只在最後發佈的WSH 2.0以及以後的版本中才有效。還在使用WSH 2.0 beta版本的開發人員仍然必須使用.ws文件擴展名。作者建議使用最新的腳本引擎和WSH。
15.3 腳本文件的類型
獨立的腳本文件有一些不同的格式,每種格式都有 自己的擴展名。表15-1中列出了一些常見的類型。最終選擇的腳本類型將依賴於需求。多數小項目只需要使用一種文件類型,但在某些情況下可能需要將整個問題分割成若干個小的部分,爲每一部分分別編寫腳本,並且每一部分的腳本都使用最合適的語言進行編寫。
表15-1
擴 展 名 |
腳 本 類 型 |
描 述 |
.bat |
MS-DOS批處理文件 |
MS-DOS操作系統的批處理文件 |
.asp |
ASP頁面 |
活動服務器網頁文件 |
.htm |
HTML文件 |
Web頁面 |
(續表)
擴 展 名 |
腳 本 類 型 |
描 述 |
.html |
HTML文件 |
Web頁面 |
.js |
JScript文件 |
Windows腳本 |
.vbs |
VBScript文件 |
Windows腳本 |
.wsf |
Windows腳本宿主文件 |
一個Windows腳本的容器或項目文件。WSH 2.0或更高版本支持 |
.wsh |
Windows腳本宿主文件 |
一個腳本文件的屬性文件。WSH 1.0或更高版本支持 |
這就是Windows腳本宿主文件(WSF文件)的有用之處。WSF文件可以包含其他的腳本文件作爲其腳本的一部分。這意味着多個WSF文件可以引用創建並保存在同一地點的庫和有用的函數。
5.4 使用Windows腳本宿主運行腳本
WSH提供了兩個用於執行腳本的接口,一個用於命令行,一個用於Windows環境。這兩個接口各使用不同的宿主程序作爲VBScript引擎:
● cscript.exe:用於在命令行中運行腳本
● wscript.exe:用於在Windows環境中運行腳本
之所以有兩個宿主程序,是因爲cscript.exe被設計爲從控制檯窗口啓動(一般來說是Windows中的MS-DOS窗口),而wscript.exe則用於直接與Windows GUI進行交互。這兩者就功能來講幾乎沒有區別。
15.4.1 命令行執行
執行腳本文件的命令行界面,cscript.exe調用方法如下:
1. 打開Run對話框(按下窗口鍵+R)或某個命令窗口(在Windows 9x中,可以依次單擊Start|Programs|DOS Prompt;在Windows NT中,依次單擊Start|Programs|Command Prompt;在Vista/XP中,依次單擊Start|All Programs|Accessories|Command Prompt)。
注意,在使用Windows Vista時,打開Command Prompt需要系統管理員權限。最簡單的方法是以系統管理員身份在開始菜單中用鼠標右鍵單擊Command Prompt並選擇Run。
2. 執行腳本如下:
cscript c:/folderName/YourScriptName.vbs
如果直接在命令行中運行cscript.exe時不加參數,就只會得到使用幫助信息,如圖15-1所示。
圖15-1
使用語法如下:
cscript scriptname.extension [option...] [arguments...]
cscript.exe提供瞭如表15-2中所列的命令行選項,可以用來控制各種WSH環境設置。
表15-2
//B |
批處理模式 這種模式下不顯示腳本錯誤和輸出信息 |
//D |
啓用主動調試 |
//E:engine |
使用引擎來執行腳本 |
//H:Cscript |
將默認的腳本宿主修改爲cscript.exe |
//H:Wscript |
將默認的腳本宿主修改爲wscript.exe(此爲默認選項) |
//I |
交互模式(此爲默認選項,它與//B是兩種相反的模式) |
//Job:xxxx |
執行一個WSF作業 |
//Logo |
顯示logo(此爲默認選項) |
//Nologo |
不顯示logo。執行時不顯示banner |
//S |
保存當前用戶的當前命令行選項 |
//T:nn |
超時時間(以秒爲單位)。該時間爲腳本在中止執行之前被允許的最長執行時間 |
//X |
在調試器中執行腳本 |
//U |
使用Unicode重定向來自控制檯的I/O |
可以在命令行中以開關的形式增加這些選項以便使用它們。下面的示例在調試器中執行一個腳本。
cscript MyScript.vbs //X
15.4.2 在Windows環境中執行WSH
執行腳本文件的Windows GUI界面是wscript.exe,它允許以下列幾種方式執行文件:
● 如果文件的類型註冊爲在WSH中執行,就可以直接在文件夾窗口或桌面上雙擊這些文件的圖標來執行。
● 如果使用Run命令對話框,那麼就只要輸入腳本的完整路徑和名稱即可。
在Run命令對話框中,可以調用wscript.exe。
wscript c:/folderName/YourScriptName.vbs
如果在命令行提示符下運行wscript.exe,就不會有輸出信息,而是會出現一個如圖15-2所示的對話框。該對話框提供了最基本的定製選項。如果在Run命令對話框中運行wscript.exe,也會出現相同的對話框。
圖15-2
單擊OK按鈕後,將不會有任何反應。在系統級定製腳本行爲的唯一方法就是使用先前曾詳細介紹的cscript選項。使用.wsh文件實現的每個腳本的獨立定製將使用該對話框來完成,這在稍後會介紹。
那麼這兩種運行腳本的方法之間有什麼區別呢?當 調試一個出錯腳本時,cscript和wscript之間的主要區別實際上變得更明顯了。這是因爲,相對於wscript可能產生的沒完沒了的彈出窗口來說,向一個控制檯窗口發送錯誤消息顯得更快更容易。在調試腳本時,推薦使用cscript,而在打印調試輸出結果時,最好使用WScript對象的 Echo方法,因爲調試時能產生大量的需要關注的錯誤信息。實際上,有時可能使調試者陷入循環,無法從錯誤消息中擺脫出來。
15.5 使用.WSH文件運行腳本
有時也許不想或不需要在每次執行腳本時都修改設 置,但又有可能需要控制單個的文件,這一點可以通過創建控制文件來實現。控制文件的擴展名爲.wsh,用於控制單個腳本的設置。.wsh文件是短小的配置 文件,它大體上遵循以前的Windows所使用的.ini文件格式(但這並不是說有程序員已經不再使用類似於.ini文件的配置文件了)。.wsh文件非常便於定製腳本的啓動—— 一個腳本可以使用多個不同的.wsh文件。
要創建一個.wsh文件,可以用鼠標右鍵單擊一個與WSH關聯的文件(一般帶有.js、.vbs或.wsf的擴展名),然後選擇Properties,在圖15-3所示的對話框中選擇Script標籤頁。
圖15-3
這個對話框可以用於修改超時時間的默認設置,也 可以修改在命令行中運行腳本時,是否顯示logo信息。一旦應用或接受了所做的修改,就會創建一個新的文件,文件名與所處理的腳本文件相同,只是擴展名爲.wsh。這個新的文件記錄了定製的設置,其格式可以被宿主引擎設置運行時選項。這裏給出一個從腳本test.vbs創建的一個.wsh文件。
[ScriptFile]
Path=C:/test.vbs
[Options]
Timeout=25
DisplayLogo=0
要使用這些選項執行腳本,就應該運行test.wsh文件。
轉摘源地址:http://wenku.baidu.com/view/5d23660203d8ce2f006623af.html