返回列表 回復 發帖

Windows Script Host

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

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 等兩種副檔名。
找出直譯器之後,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 ExplicitDim strHostName,strHostFullPathName,strScriptFullNameDim strMessagestrHostName = WScript.Name & " " & WScript.Version & vbCrLfstrHostFullPathName = "目前的 WSH 程式是由 " & WScript.FullName & "所執行" & vbCrLfstrScriptFullName = "所執行的 WSH 程式是 " & WScript.ScriptFullNamestrMessage = strHostName & vbCrLf & strHostFullPathName & vbCrLf & strScriptFullNameMsgBox 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 捷徑。

附件: 您所在的用戶組無法下載或查看附件
2005.12.04不預期遇見什麼、才可能什麼都能遇見。
如果你是會員,有任何使用上的問題,請發短訊給我(wen)
如果你是訪客的話,註冊之後可以得到完整的瀏覽權限
很實用的知識...感謝大大的分享
返回列表