Windows Server System 系統管理之 Windows Script Host

**作者:**賴榮樞
http://www.goodman-lai.idv.tw

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

本頁內容

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 的物件模組簡表

WSH 相關資源

這篇文章說明了 WSH 的基本運作方式,Windows 說明檔案也有相關的文件可以參考,您可以在『說明及支援中心』以 WSH 作為搜尋關鍵字,便能找到相關說明。此外,微軟網站也包含了相當豐富的說明文件,以及 WSH 5.6 執行環境可以下載。

  • MSDN Windows Script:您可以這裡找到所有 WSH 和 VBScript、JScript 等文件,這裡是微軟 Scripting 語言的技術資料大本營。

  • Microsoft Windows Script Downloads:這裡列出了 WSH 相關的下載資源,包括了適用於各種 Windows 版本的 WSH 5.6 執行環境、WSH 5.6說明文件(英文、chm 格式),以及 Script Encoder、Windows Script Debugger、Windows Script Component Wizard 等工具程式。

  • 台灣微軟的 TechNet Script Center:這裡有中文的 WSH 系統管理相關資源,包括文章以及現成的 WSH 程式。尤其『指令碼存放庫』和『指令碼方案中心』等單元,都分門別類的列出非常實用且附有使用說明的 WSH 程式,都是免費且現成可用。而『嗨,Scripting Guy!』則是以問答的方式,討論 WSH 程式系統管理技巧的專欄。

  • TechNet Script Cener:這裡的資料雖然都是英文,但是資料更為豐富。

  • Automating TCP/IP Networking on Clients:這是以 WSH 程式自動管理 TCP/IP 網路 Windows 用戶端的說明文件和範例,內容相當豐富且實用。