Happy Scripting!

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

我在「Windows Server System 系統管理之 Windows Script Host」文章已經介紹過 WSH(Windows Script Host)的運作方式、檔案類型、物件模組,在本文,我將接續 WSH 的議題,說明如何使用、修改、撰寫WSH指令檔(script),並且也將詳細介紹微軟 TechNet 網站的相關資源。

WSH 指令檔對 Windows 系統管理甚為有用,但是許多 IT 人員可能一聽到要自己寫程式,就會對 WSH 指令檔退縮。其實要撰寫 WSH 指令檔並不困難,而且已經有許多專為 Windows 系統管理設計的 WSH 指令檔可以直接取用,微軟也為此提供了非常多現成可用的 WSH 指令檔,而且都已經分門別類便於搜尋,IT 人員可以先從使用現成的 WSH 指令檔,作為接觸 WSH 指令檔的第一步,並且一邊使用一邊試著瞭解 WSH 指令檔的物件、語法。

有些時候,現成的 WSH 指令檔或許不完全符合你的需求,因此你可以試著動手修改。如果能夠修改現成的 WSH 指令檔,這算是跨過了第二個門檻。網路上現成的 WSH 指令檔真的很多,因此通常你都不需要自己撰寫,但如果你能夠看懂這些 WSH 指令檔,就可以動手修改,或者參考現成的 WSH 指令檔內容成符合你所需要的。

參考越多的 WSH 指令檔,你對 WSH 就越有自己的心得,只要累積足夠的經驗,你就能自行撰寫 WSH 指令檔來處理系統管理的瑣碎事務。對現職的 IT 人員來說,如果能利用這種「做中學」的方式,既顧好工作上的需要,又能從中學到知識,的確是再理想不過了。

本頁內容

執行與編修 WSH 指令檔
指令碼存放庫
參考文件及專欄文章
Happy Scripting
相關資源

執行與編修 WSH 指令檔

WSH 指令檔是以直譯的方式執行,因此在執行 WSH 指令檔之前,請先確定電腦已經備妥適當的直譯環境。目前最新的 WSH 執行環境版本是 5.6。檢查 WSH 版本最簡單的方法,就是開啟『命令提示字元』視窗,然後提示字元之後輸入 CScript,再按下 Enter 按鍵,就會顯示 Windows Script Host 版本序號。如果版本序號不是 5.6,可以依照以下說明下載並安裝 WSH 5.6 的中文版:

WSH 指令檔通常都是純文字檔案,因此只要利用文字編輯程式,就可以編寫或瀏覽 WSH 指令檔。當你第一次執行別人所寫的WSH指令檔時,強烈建議你先以文字編輯程式檢視過程式內容,確定過程式內容之後再執行,以免執行結果超過預期。此外,也應該留意 WSH 指令檔的來源,例如直接從微軟下載的 WSH 指令檔應該不會有問題,但如果是來路不明的 WSH 指令檔,必須先確認過內容之後再執行,才是保險之道。

雖然文字編輯程式都可以編寫或瀏覽 WSH 指令檔,但是我建議你使用具備 WSH 語言(例如 VBScript 或 JScript)syntax highlight 功能的文字編輯程式,因為 syntax highlight 功能能以不同的顏色呈現程式碼中的 VBScript 關鍵字指令、變數、註解等等,這會增加你檢閱程式的便利性,也能讓你一眼就能看出哪些是指令、哪些又是變數。

圖 1:EmEditor 具備 VBScript 語法的 syntax highlight 功能

圖 1:EmEditor 具備 VBScript 語法的 syntax highlight 功能

我自己慣用的文字編輯程式是 EmEditor,偶爾也會以 Visual Studio.NET 來編輯 WSH 指令檔。如果你會經常編寫 WSH 指令檔,也建議你找一個自己用起來順手,而且也具備 syntax highlight 功能、並且也能顯示行號的文字編輯程式,因為好的工具往往會提生產能。

圖 2:Visual Studio.NET 也可以編寫 WSH 指令檔

圖 2:Visual Studio.NET 也可以編寫 WSH 指令檔

有兩種執行 WSH 指令檔的方式,一是直接以滑鼠雙按 WSH 指令檔,另一種是在『命令提示字元』視窗,以 CScript <WSH 指令檔名> 的方式執行(WSH 指令檔名必須包含副檔名);如果 WSH 指令檔需要在執行時給予參數,就可以利用 CScript:

CScript <WSH 指令檔名> <參數>

這裡有兩個簡單的 WSH 指令檔,第一個是 Wsh_simple.vbs:

' Wsh_simple.vbs by Goodman Lai, 2005/06/15
' 簡單的WSH指令檔
' 變數使用之前必須先宣告
Option Explicit
' 宣告變數
Dim strHostName,strHostFullPathName,strScriptFullName
Dim strMessage
' 取得WSH全名與版本序號
strHostName = WScript.Name & " " & WScript.Version & vbCrLf
' WScript.FullName 是WSH直譯程式的完整路徑
strHostFullPathName = "目前的WSH程式是由 " & WScript.FullName & "所執行"
& vbCrLf
' WScript.ScriptFullName是目前這個WSH指令檔的完整路徑
strScriptFullName = "所執行的WSH程式是 " & WScript.ScriptFullName
' 合併三個字串
strMessage = strHostName & vbCrLf & strHostFullPathName & vbCrLf
& strScriptFullName
' 以 MsgBox顯示訊息,vbInformation常數會讓交談窗出現i圖示,"WSH相關訊息"是
交談窗標題
MsgBox strMessage, vbInformation, "WSH 相關訊息"

第二個是 wsh_version.vbs:

' wsh_version.vbs, written by Goodman Lai, 2005/06/15
' 顯示 WSH、VBScript、WMI、ADSI 等版本的序號

' 如果這個程式執行時發生錯誤,也會繼續執行
On Error Resume Next

strComputer = "."
' 取得 WMI 版本序號
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=
impersonate}!\\" & _
  strComputer = "." & "\root\cimv2")
Set colWMISettings = objWMIService.ExecQuery("Select * from 
Win32_WMISetting")
For Each objWMISetting in colWMISettings
    strWmiBuilderVersion = objWMISetting.BuildVersion
Next

' 取得 ADSL 版本序號
Set objShell = CreateObject("WScript.Shell")
strAdsiVersion = objShell.RegRead("HKLM\SOFTWARE\Microsoft\
Active Setup\Installed Components" & _
 "\{E92B03AB-B707-11d2-9CBD-0000F87A369E}\Version")
If strAdsiVersion = vbEmpty Then
    strAdsiVersion = objShell.RegRead("HKLM\SOFTWARE\Microsoft\
    ADs\Providers\LDAP\")
    If strAdsiVersion = vbEmpty Then
        strAdsiVersion = "ADSI is not installed."
    Else
        strAdsiVersion = "2.0"
    End If
End If

' 顯示 WSH、VBScript、WMI、ADSI 等版本的序號
' VbCrLf 是 VBScript 內建的常數,表示換行
WScript.Echo "WSH 版本序號:" & WScript.Version & VbCrLf & VbCrLf & _
 "VBScript 版本序號:" & ScriptEngineMajorVersion & "." & _
ScriptEngineMinorVersion & VbCrLf & VbCrLf & _
 "WMI 版本序號:" & strWmiBuilderVersion & VbCrLf & VbCrLf & _
 "ADSI 版本序號:" & strAdsiVersion

我在程式裡寫了相關的註解,你可以將它們存成 vbs 檔案,並且檢視程式內容,再執行它們,看看執行結果是否如你預期。

WSH 能在執行階段提供適當的錯誤訊息,包括以行號告知錯誤的地方,以及錯誤的原因。如果你在執行 WSH 指令檔的時候,出現了執行錯誤,可以利用 WSH 提供的錯誤訊息,找到錯誤的來源並修正。例如圖 3 的錯誤訊息,指出了錯誤的程式檔名、行號字元、原因等等。

圖 3:WSH 提供的錯誤訊息

圖 3:WSH 提供的錯誤訊息

在 TechNet 網站有一篇「指令檔常見問題集」,對 WSH 指令檔新手也很有幫助。此外,新手也可以參考我之前的「Windows Server System 系統管理之 Windows Script Host」文章。

指令碼存放庫

WSH 指令檔對 Windows 系統管理相當實用,但可能不見得人人都能在短時間之內熟悉 WSH、寫出指令檔,因此微軟也提供了相當多且經過分門別類的現成 WSH 指令檔。在台灣微軟的「TechNet Script - 指令碼存放庫」,一共有 15 個類別,分別是:

 

 

 

電腦管理

磁碟與檔案系統

企業指令檔

檔案與資料夾

記錄

監視

連線作業

列印

處理程序

登錄

安全性

服務

工作排程

使用者及群組

其他

這些 WSH 指令檔大多利用 WMI 機制在處理相關的系統管理事務,因此這些 WSH 指令檔的開頭都會有這麼一行:

strComputer = "."

這行程式是用來設定被管理電腦的名稱,這裡所有的 WSH 指令檔預設是管理本機電腦,因此電腦名稱是英文的句點。如果想要管理的是遠端的電腦,必須修改電腦名稱,例如:

strComputer = "MailServer"

此外,也是更重要的,當然是必須擁有該部電腦的系統管理權限,才能透過遠端執行 WSH 指令檔的方式,來管理該部電腦。

而在美國微軟的 The Script Center Script Repository,提供了更多現成的 WSH 指令檔,一共有 24 個類別,每個類別可能還有 2、3 個次類別:

 

 

 

Active Directory

Applications

Desktop Management

Group Policy

Hardware

Internet Information Server
(IIS)

Logs

Messaging and Communication

Microsoft Office

Networking

Operating System

Other Directory Services

Printing

Scripting Techniques

Security

Service Packs and Hot Fixes

Services for Unix

Shadow Copy

SMS 2003

Software Update Services

SQL Server

Storage

Terminal Server

Virtual Server

微軟也將上述這些 WSH 指令檔整理成 CHM 檔案格式,並且可以免費下載,下載回來的 script_center.exe 是個自解壓縮檔,解開之後是 script_center.chm,只要執行這個檔案,就能在本機電腦瀏覽、取用裡面的 WSH 指令檔(如圖 4)。

圖 4:整理成單一檔案的 WSH 指令檔

圖 4:整理成單一檔案的 WSH 指令檔

此外微軟也提供了「指令碼方案中心」,裡面是適用於大型或解決特定情況的 WSH 指令檔(原文的 Scripting Solutions Center 是在 https://www.microsoft.com/technet/scriptcenter/solutions/default.mspx)。

參考文件及專欄文章

不管使用「指令碼存放庫」或「指令碼方案中心」的現成 WSH 指令檔,都可以檢視程式內容,盡量從中多學幾招。但不論如何,手邊都需要相關的參考文件,以備查詢之用。首先需要 WSH 程式語法的參考文件,由於大部分 WSH 指令檔都是以 VBScript 撰寫,因此新手應該準備一份 VBScript 的文件。再者,也需要準備 WSH 相關物件模組的參考文件。以下是微軟提供的相關文件。

  • Windows Script 5.6 Documentation:CHM 格式的英文文件,可以免費下載。文件內容包含 VBScript、JScript、WSH 物件基礎教學,以及 VBScript 和 Jscript 語法的參考。

  • Microsoft Windows 2000 Scripting Guide:這份英文文件並不會因為是為 Windows 2000 所寫就顯得太舊,其中提供了 VBScript、WSH、Script Runtime、ADSI、WMI 等快速入門教學,也提供了為系統管理撰寫 WSH 指令檔的技巧與範例。

除了文件之外,微軟也提供了許多 WSH 指令檔相關專欄文章:

Happy Scripting

無論如何,就捲起袖子,以「做中學」的方式開始體驗 WSH 指令檔吧!對中大型的電腦環境,或者是日常瑣碎的事務,WSH 指令檔可以發揮相當的效益。WSH 指令檔應該是 Windows 系統管理者必備的工具喔,Happy scripting!

相關資源