20130608

Windows Script Host

Windows Script Host(簡稱 WSH)最早是出現在 Windows 98,在當時,WSH 還是一項不大引人注目的新功能,而經過不斷的發展與強化,隨後的每個 Windows 作業系統(包括用戶端與伺服端版本),都內建 WSH,目前 WSH 的最新版本是 5.6。WSH 是 Windows 作業系統的 script 程式執行環境,透過這個環境,您可以自行撰寫一些程式,來簡化日常的工作流程,或是製作一些實用的系統管理程式。

本頁內容
WSH 簡介WSH 簡介
WSH 的檔案類型WSH 的檔案類型
編寫 WSH 程式初步編寫 WSH 程式初步
執行 WSH 程式執行 WSH 程式
WSH 的物件模組WSH 的物件模組
WSH 相關資源WSH 相關資源

WSH 簡介

WSH 是個 script 程式執行環境,這個環境以微軟的 COM 技術為基礎,因此其他的廠商可以自己的技術或產品來擴充 WSH。WSH 環境包含了:
Scripting Engine:這是 script 程式的直譯器(interpreter),負責解譯 script 程式。WSH 內建了 VBScript(vbscript.dll)和 JScript(jscript.dll)兩套 script 程式的直譯器,也已經有廠商擴充了其他的 script 語言,例如 ActiveState 公司 Windows 版本的ActivePerl 便支援 WSH,可以在 WSH 環境執行 Perl 程式。
Scripting Host:這個部分負責 script 程式的起始、結束,也提供程式所需的基本功能,例如在螢幕顯示訊息、對映網路磁碟機、連接印表機、存取或修改環境變數、讀寫登錄資料庫等等。此外,WSH 也允許利用 COM 物件來擴充 script 程式的功能,script 程式則利用 Scripting Host 所提供的 CreateObject 或 GetObject 函數來使用 COM 物件;例如使用 FSO(file system object)來存取檔案或資料。WSH 提供了兩個 Scripting Host 執行環境:WScript.exe、CSript.exe,前者是圖形模式,後者是命令列模式。
WSH 在執行使用者所交付的程式時,會先根據所要程式檔的副檔名,到系統登錄資料庫中查詢可以解譯這種程式的解譯引擎;WSH 內建的 VBScript 以及 Jscript 直譯器,分別對應到 .vbs 以及 .js 等兩種副檔名。
圖 1:WSH 架構圖
圖 1:WSH 架構圖
找出直譯器之後,WSH 就會從檔案中將程式一行一行的讀出,然後送到直譯器,由直譯器解釋程式所執行的動作。如果所執行的動作必須使用到 WSH 所提供的功能服務,例如存取檔案或是登錄資料庫的內容,就向 WSH 提出要求,由 WSH 負責處理。
其實 WSH 不只可以應用在系統管理,微軟的 ASP(Active Server Pages)網頁技術,也是以 WSH 為架構所發展。而WSH架構也可以嵌入應用軟體,成為應用軟體的巨集語言。

WSH 的檔案類型

除了 .vbs、.js 之外,WSH 還有 .wsf 和 .wsh 兩種檔案類型,而這四種檔案類型都是純文字格式。.wsf 是 WSH 2.0 所新增的副檔名,這種類型最大的優點是可以包含其他 .vbs或.js 程式,是 WSH 的專案檔。上述三種類型都是 WSH 程式,它們利用 WSH 環境、直譯器在執行;而 .wsh 則是儲存 WSH 程式執行參數的檔案。
.wsh 類似 Windows 的捷徑,試著想像一種情況:某個 Windows 程式可以根據不同的命令列執行參數,而有不同的執行方式,如果不想每次執行都輸入繁瑣的執行參數,當然就是替每種執行參數建立捷徑,不同的捷徑啟動不同參數的執行方式。同樣的,WSH 程式也可以有數種不同的執行參數,如果每次執行都得重新調整執行參數,著實麻煩累人,但是只要利用不同的 .wsh 檔案,就可以記錄同一個 WSH 程式的各種執行參數。
只要以滑鼠右鈕按下 WSH 程式,再選取快顯功能表中的「內容」,便可以調整 Scripting Host 執行 WSH 程式的執行參數。假設您在執行某個 WSH 程式時,經常需要更改 WSH 程式的終止時間參數,除了每次執行 WSH 程式之前,都開啟交談窗來修改之外,最好的方法應該是替不同的終止時間建立不同的 .wsh 檔案。
只要您利用上述的交談窗修改了 WSH 程式的執行參數,Windows 系統便會自動建立一個主檔名與 WSH 程式的主檔名相同,但副檔名為 .wsh 的 WSH 程式設定檔。但是請特別注意,如果 WSH 程式的設定檔已經存在,那麼新的設定值會蓋掉舊的設定值,因此如果想要保留舊的設定檔,請記得一定要先更改設定檔的主檔名,再利用交談窗來調整。.wsh 檔案的格式非常類似 .ini 或 .inf 檔,而且結構非常簡單。

編寫 WSH 程式初步

WSH 程式跟一般的 script 程式一樣,都是純文字檔,因此您可以利用文字編輯程式來編寫 WSH 程式,而許多文字編輯程式都會提供更多便利的功能,協助編寫 script 程式;例如我所慣用的 EmEditor 便支援 WSH 程式的三種類型。
這裡有個簡單的 WSH/VBScript 程式(WSHInfo.vbs),會以交談窗顯示 WSH 執行環境的版本、路徑及程式檔名,以及 WSH 程式的路徑和程式檔名等相關資訊:
' WSHInfo.vbs 顯示 WSH 的若干訊息
Option Explicit
Dim strHostName,strHostFullPathName,strScriptFullName
Dim strMessage
strHostName = WScript.Name & " " & WScript.Version & vbCrLf
strHostFullPathName = "目前的 WSH 程式是由 " & WScript.FullName & 
"所執行" & vbCrLf
strScriptFullName = "所執行的 WSH 程式是 " & WScript.ScriptFullName
strMessage = strHostName & vbCrLf & strHostFullPathName & 
vbCrLf & strScriptFullName
MsgBox strMessage, vbInformation, "WSH 相關訊息"   
.wsf 的格式比 .vbs 或 .js 略微複雜,因為 .wsf 採用了 XML 格式,因此也新增了專屬的標籤(tag);以下將說明基本的四個標籤:<package>、<job>、<object>、<script>(完整的資料請參照 WSH 說明文件)。必須提醒您的是,這些標籤僅適用於 .wsf 檔案,如果您是以 .vbs 或 .js 製作 WSH 程式,就不能替程式加入這些標籤,否則就會出現錯誤訊息。
只要以<script>標籤加以區隔,.wsf 就可以混合使用多種描述語言:
<script language="VBScript">
  程式碼
</script>

或

<script language="JavaScript">
  程式碼
</script>
在.wsf 檔案中,程式都必須放在<script>區段,並且以標註程式的描述語言名稱。<script>標籤還有另一個 src 屬性,透過這個屬性,可以達到類似 C 語言的 include 功能。也就是說,src 屬性可以引入其他的 JavaScript 程式或 VBScript 程式,並且執行,例如:
<script language="JavaScript" src="getInfo.js"/>
此外,每個 .wsf 檔案至少必須包含一個<job>區段。<job>區段是 WSH 程式的最小執行單位。如果 .wsf 檔案只有一個<job>區段,那麼 .wsf 檔案執行時,其實就是執行這唯一的一個<job>區段:
<job>
<script language="script名稱">
  程式碼
</script>
</job>
.wsf 檔案也可以包含數個<job>區段,不過像這種情況,有幾件事必須特別注意。首先,必須有一對<package>標籤括住所有的<job>區段,而且每個 .wsf 檔案也只能有一對<package>標籤。其次,在有數個<job>區段的情況之下,每個<job>區段就必須利用<job>標籤的 ID 屬性替<job>區段命名。
之前提過<job>區段是 WSH 程式的最小執行單位,而每次執行 .wsf 檔案,其實是執行 .wsf 檔案<job>區段的程式碼。但是在同時擁有數個<job>區段的情況之下,WSH 執行環境會執行那個<job>區段呢?這可以由使用者透過 WSH 執行環境(也就是 WScript 或 CScript)的 //Job 選項來指定,假設 jobs.wsf 裡面有兩個<job>:
<package>
  <job id="CopyFile">
     <script language="script 名稱">
        程式碼
     </script>
  </job>
  <job id="DelFile">
     <script language="script 名稱">
        程式碼
     </script>
  </job>
</package>
如果要以 CScript 搭配 //Job 選項來指定所要執行的 <job>,下列第一行指定要執行 CopyFile,第二行則指定要執行 DelFile:
CScript //Job:CopyFile jobs.wsf
CScript //Job:DelFile jobs.wsf
如果 .wsf 檔案裡面擁有數個 <job> 區段,但卻沒有利用 //Job 選項指定 <job> 區段,那麼 WSH 執行環境會以 .wsf 檔案裡面的第一個 <job> 區段,作為預設執行的 <job> 區段。
<object> 標籤的用途是讓我們可以在同一個 <job> 區段的各個 <script> 區段共用某個物件。由於 WSH 並沒有全域變數,因此如果在 <job> 區段的各個 <script> 區段都需要用到某個物件,勢必無法將物件指定給全域的物件變數,而必須在各個 <script> 區段都以 WScript.CreateObject 方法自行建立相同的物件,但如果真的這麼做的話,實在是相當耗用系統資源。
而 <object> 的作用相當類似全域物件變數,如果您需要在同一個 <job> 區段的各個 <script> 區段使用相同的物件,就可以先利用 <object> 標籤宣告物件,便可以在各個 <script> 區段內共用同一個物件了。

執行 WSH 程式

WSH 提供了兩種執行 WSH 程式的 Scripting Host:圖形模式的 WScript、命令列模式的 CScript,前者是直接以滑鼠雙按 WSH 程式,後者則是在命令列環境輸入相關指令,例如在命令列環境下利用 CScript 的 //E 選項指定 VBScript 作為解譯引擎:
CScript //E:VBScript WSHInfo.vbs

WSH 的物件模組

想要善用 WSH,除了必須先熟悉 VBScript 或 JScript 等描述語言之外,也必須了解 WSH 所提供的物件模組。表格 1 是 WSH 的物件模組簡表,(完整的資料請參照 WSH 說明文件)。
物件名稱說明
WScript 物件
WScript 物件代表的是整個執行環境,也可以說是一切功能的源頭;這是 WSH 物件模組最重要的物件。
WshArguments 物件
如果想讓 WSH 程式接收使用者在命令列執行時所輸入的參數,就必須利用 WshArguments 物件;這個變數會收集使用者在命令列所輸入的參數。
WshEnvironment 物件
WshEnvironment 物件可以讓我們藉以取得整個系統的環境參數;必須注意的是,因為 Windows 95/98 與 Windows NT/2000 的系統設計即有相當的差別,因此索取的系統環境變數亦不相同。
WshNetwork 物件
WshNetwork 物件代表的是整個網路環境,提供的是像連線網路磁碟機、連接網路印表機等等這類功能。
WshShell 物件
WshShell 物件的作用是提供一些像是存取登錄資料庫、建立應用程式、目錄捷徑、或是執行應用程式等需要系統功能幫忙的服務,就像是 Windows 中 Explorer 程式所扮演的角色一樣。
WshShortcut 物件
利用 WshShortcut 物件可以建立指向捷徑的物件,WSH 程式便可以利用這個物件可以操控捷徑。
WshSpecialFolders 物件
WshSpecialFolders 物件可以讓我們的 WSH 程式操控諸如「桌面」、「開始功能表」或「我的文件」等 Windows 系統資料夾。
WshURLShortcut 物件
WshURLShortcut 物件可以建立指向 URL 捷徑的物件,WSH程式便可以利用這個物件操控 URL 捷徑。

表格 1:WSH 的物件模組簡表

沒有留言:

張貼留言