20130610

WshShell.run 函式的參數


在一個新程序執行程式。

set WshShell= CreateObject(“Wscript.Shell”)
WshShell.run "notepad.exe"

run 函數有三個參數,第一個參數是你要執行的程序的路徑,若路徑中存在空格,如 """C:\Program Files\QQ2006\QQ.exe""" ‘注:三個引號,

第二個程序是窗口的形式,0是在後台運行;1表示正常運行;2表示激活程序並且顯示為最小化;3表示激活程序並且顯示為最大化;一共有10個這樣的參數如下表。

第三個參數是表示這個腳本是等待還是繼續執行,如果設為了true,腳本就會等待調用的程序退出後再向後執行。
其實,run做為函數,前面還有一個接受返回值的變量,一般來說如果返回為0,表示成功執行,如果不為0,則這個返回值就是錯誤代碼,可以通過這個代碼找出相應的錯誤。

intWindowStyle 說明
0 隱藏一個窗口並激活另一個窗口。
1 激活並顯示窗口。如果窗口處於最小化或最大化狀態,則系統將其還原到原始大小和位置。第一次顯示該窗口時,應用程序應指定此標志。
2 激活窗口並將其顯示為最小化窗口。
3 激活窗口並將其顯示為最大化窗口。
4 按最近的窗口大小和位置顯示窗口。活動窗口保持活動狀態。
5 激活窗口並按當前的大小和位置顯示它。
6 最小化指定的窗口,並按照 Z 順序激活下一個頂部窗口。
7 將窗口顯示為最小化窗口。活動窗口保持活動狀態。
8 將窗口顯示為當前狀態。活動窗口保持活動狀態。
9 激活並顯示窗口。如果窗口處於最小化或最大化狀態,則系統將其還原到原始大小和位置。還原最小化窗口時,應用程序應指定此標志。
10 根據啟動應用程序的程序狀態來設置顯示狀態。

VBScript 自動化指令 WshShell 物件

WshShell 物件的作用是提供一些像是存取登錄資料庫、建立應用程式、目錄捷徑、或是執行應用程式等需要系統功能幫忙的服務,就像是 Windows 中 Explorer 程式所扮演的角色一樣。

WshShell對象的屬性

1.Environment :
返回WshEnvironment對象。
語句: object.Environment([strType])
參數: object:WshShell對象。
StrType:可選參數。
用來指定環境變量的位置。 

2.SpecialFolders 說明:提供Wsh特殊文件夾對象來處理Windows shell文件夾例如desktop文件夾。開始菜單文件夾和個人文檔文件夾。 語句:object.SpecailFolders(objWshSpecialFolders) 參數: object:WshShell對象。 objWshSpecailFolders:返回的特定文件夾名。 ps:如果電泳的文件夾名(strFolderName)無效,則返回零值NULL。

VBScript 自動化 Telnet 指令

要利用 VBScript 作自動化,首先要知道如何執行外部程式以及模擬鍵盤輸入
執行外部程式是利用 WScript.Shell 物件中的 run 方法
模擬鍵盤輸入是使用SendKeys方法

範例如下:

'建立 WScript.Shell 物件
set WshShell = WScript.CreateObject("WScript.Shell")
'開啟命令視窗
WshShell.run"cmd.exe"
WScript.Sleep 1500
'Send keys to active window; change the
' ip address as needed.
'WshShell.SendKeys"telnet IP address"
'Emulate the enter key
'WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'write the user name to the cmd window
WshShell.SendKeys"username"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'write the password to the cmd window
WshShell.SendKeys"password"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'change to sudo access
WshShell.SendKeys"change to sudo"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'Start SM
WshShell.SendKeys"run UNIX start script"
WshShell.SendKeys("{Enter}")
WScript.Sleep 20000
'exit sudo
WshShell.SendKeys"exit"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'exit the telnet session
WshShell.SendKeys"exit"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1500
'Exit the program
WshShell.SendKeys"% "

20130608

WSH基礎物件

一:WScript對象的屬性
1.Arguments
說明:向Wsh參數集返回一個指針或為參數指定快捷方式的參數。
語句:object.Arguments
參數:objectWScript或WSH快捷方式對象。
例子:將在參數集中顯示所有命令行里的參數。
Set objArgs=WScript.Arguments
For I=0 to objArgs.Count-1
Wscript.Echo objArgs(I)
Next

2.FullName

說明:返回一個含有宿主執行文件或對象快捷方式的完整路徑的字符串。 參數:WScript,Wsh快捷方式或WshUrl快捷方式對象。 
例子:返回宿主執行文件的路徑。 
WScript.Echo WScript.Fullname 

3.Name 說明:返回含有WScript對象友好的名稱的字符串。 語句:object.Name 參數:object:WScript對象。 ps:默認的屬性是只讀屬性。 例子:顯示了兩種使用此屬性的方法。 WScript.Echo WScript.Name WScript.Echo WScript 4.Path 說明:提供包含WScript.exe或CScript.exe文件的目錄名稱的字符串。 語句:object.Path 例子 WScript.Echo WScript.Path 

5.ScriptFullName 說明:提供當前運行的腳本的完整路徑。 
語句:object.SceiptFullName

6.ScriptName 說明:提供當前運行的腳本的文件名 ​​稱。 語句:object.ScriptName 例子: WScript.Echo WScript.ScriptName 

7.StdErr 說明:當前腳本的只寫錯誤輸出流。 語句:object.StdErr 參數:WScript對象。 ps:StdIn,StdOut,和StdErr的屬性只有在運行CScript來執行腳本時候才有效。如果採用WScript.exe來執行腳本,則會導致"無效操作”的錯誤。 

8.StdIn 說明:當前腳本的只讀輸入流。 語句:object.StdIn 

9.StdOut 說明:當前腳本的只寫輸入流。 

10.Version 說明:返回Microsoft Windows Script Host的版本信息。 語句: object.Version 例子:WScript.Echo WScript.Version



三.WshNetwork對象的屬性。

1.ComputerName 說明:提供代表計算機名的字符串。 語句: object.ComputerName 參數: object:WshNetwork對象 

2.UserDomain 說明:提供代表用戶域名的字符串。 語句: object.UserDomain 參數: object:WshNetwork對象 

3.UserName 說明:提供代表用戶名的字符串。 語句: object:WshNetwork對象 



五.WshShortcut對象的屬性。 

1.Description 說明:提供快捷方式對象的說明 語句: object.Description 參數:object:WshShortcut對象。 
2.Hotkey 說明:當熱鍵即提供快捷方式的hotkey,是一種啟動一個程序的鍵盤快捷方式。 語句: object.Hotkey=strHotkey 參數:strHotkey:定制按鍵的次序。 

3.IconLocation 說明:提供快捷方式對象的圖標位置。 語句: object.IconLocation=strIconLocation 

4.TargetPath 說明:設置快捷方式對象的可執行文件的路徑。 

5.WindowStyle 說明:提供快捷方式對象的窗體風格。 語句:object.WindowStyle=intWindowStyle ps:intWindowStyle可以使用的設置。 
1激活並顯示一個窗口。如果窗口被最大化或最小化,系統將其恢復為原始的大小和位置。 

3激活並最大化顯示一個窗口。 

7最大化顯示一個窗口並按ZA的順序激活其次的上層窗口。

6.WorkingDirectory 說明:提供快捷方式對象的工作目錄。 參數: strWorkingDirectory:將要啟動的快捷方式的所在目錄。[/code]

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

VBScript 模擬鍵盤輸入SendKeys

wshShell.SendKeys

模擬鍵盤操作,將一個或多個按鍵指令發送到指定Windows窗口來控制應用程序運行, 其使用格式為:

object.SendKeys(string)

object:表示WshShell對象

string:表示要發送的按鍵指令字符串,需要放在英文雙引號中。


Dim wshShell


Set wshShell = CreateObject("Wscript.Shell")
wshShell.SendKeys "{ENTER}"

1.基本鍵
一般來說,要發送的按鍵指令都可以直接用該按鍵字符本身來表示,例如要發送字母“x”,使用“WshShell.SendKeys " x"”即可。

當然,也可直接發送多個按鍵指令,只需要將按鍵字符按順序排列在一起即可,例如,要發送按鍵“happy”,可以使用“ WshShell.SendKeys "happy" ”。

2.特殊功能鍵

對於需要與Shift、Ctrl、Alt三個控制鍵組合的按鍵,SendKeys使用特殊字符來表示:   Shift---------WshShell.SendKeys "+"   
Ctrl----- ----WshShell.SendKeys "^"   

Alt---------WshShell.SendKeys "%" (注意:這樣使用時,不用大括號括起這些特殊字符。)

由於“+”、“^ ”這些字符用來表示特殊的控制按鍵了,如何表示這些”字符”的按鍵呢?只要用大括號括住這些字符即可。例如: 要發送加號“+”,可使用“WshShell.SendKeys "{+}"” 另外對於一些不會生成字符的控制功能按鍵,也同樣需要使用大括號括起來按鍵的名稱。--如果發送是基本字符用“”括起來。


例如要發送回車鍵,需要用“ WshShell.SendKeys "{ENTER}" ”表示;

Tips:如果需要發送多個重復的單字母按鍵,不必重復輸入該字母,SendKeys允許使用簡化格式進行描述,使用格式為“{按鍵 數字}”。例如要發送10個字母“x”,則輸入“WshShell.SendKeys "{x 10}"”即可。

3.實例:
----------------------------------------------------
按下F5刷新桌面

Dim WshShell,Path,i
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "{F5}"
----------------------------------------------------
電腦的自動重啟

set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^{ESC}u"
WshShell.SendKeys "R"
----------------------------------------------------
啟動任務管理器

set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^+{ESC}"
----------------------------------------------------
QQ消息群發

Dim WshShell
Set WshShell= WScript.createObject("WScript.Shell")
WshShell.AppActivate "bomb"
for i=1 to 60
WScript.Sleep 800
WshShell.SendKeys "Number0"
WshShell.SendKeys i
WshShell.SendKeys "%s"
next
----------------------------------------------------

引數
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}

VBScript 迴圈

使用迴圈重複執行程式碼
迴圈可以讓您重複的執行一群陳述式。有一些迴圈是在條件變成 False 之前,會一直重複執行陳述式;另一些則可能是在條件變成 True 時才停止迴圈。此外,還有一些迴圈是重複了某個固定次數之後就會停止。VBScript 中可以使用下列的迴圈陳述式:
  • Do...Loop:當條件是 True 時執行迴圈,也可以是執行到條件為 True 時,停止迴圈。
  • While...Wend:當條件是 True 就執行迴圈。
  • For...Next:使用一個計數器,讓陳述式重複執行某個固定的次數。
  • For Each...Next:對每個集合物件中的項目或陣列中的元素重複執行一次迴圈。
使用 Do 迴圈
您可以使用 Do...Loop 陳述式來重複執行一群陳述式數次。直到條件是 True 時,或條件變成 True 為止,迴圈會不斷的重複。
當條件是 True 時重複陳述式
在 Do...Loop 陳述式中,需用 While 關鍵字來檢查條件。您可以在進入迴圈之前就先檢查(就像以下的 ChkFirstWhile 例子),或在迴圈至少執行過一次之後再檢查(像是 ChkLastWhile 的例子)。在 ChkFirstWhile 程序中,如果 myNum 不是設成 20,而是設成 9,那麼在迴圈中的陳述式就永遠不會被執行。在 ChkLastWhile 程序中,迴圈裡的陳述式只會被執行一次。因為它的條件已經是 False 了。
 Sub ChkFirstWhile()
     Dim counter, myNum
     counter = 0
     myNum = 20
     Do While myNum > 10
         myNum = myNum - 1
         counter = counter + 1
     Loop
     MsgBox "The loop made " & counter & " repetitions."
 End Sub

 Sub ChkLastWhile()
     Dim counter, myNum
     counter = 0
     myNum = 9
     Do
         myNum = myNum - 1
         counter = counter + 1
     Loop While myNum > 10
     MsgBox "The loop made " & counter & " repetitions."
 End Sub
重複執行陳述式,直到條件變成 True 為止
在 Do...Loop 陳述式中,您有兩種方法來使用 Until 關鍵字檢查條件。您可以在進入迴圈前先檢查條件(像是以下的 ChkFirstUntil 例子),或在迴圈至少執行過一次後再檢查(像是 ChkLastUntil 的例子)。只要在條件是 False 時,迴圈就會執行。
 Sub ChkFirstUntil()
     Dim counter, myNum
     counter = 0
     myNum = 20
     Do Until myNum = 10
         myNum = myNum - 1
         counter = counter + 1
     Loop
     MsgBox "The loop made " & counter & " repetitons."
 End Sub

 Sub ChkLastUntil()
     Dim counter, myNum
     counter = 0
     myNum = 1
     Do
         myNum = myNum + 1
         counter = counter + 1
     Loop Until myNum = 10
     MsgBox "The loop made " & counter & " repetitions."
 End Sub
在迴圈中跳離 Do...Loop 陳述式
您可以在 Do...Loop 中使用 Exit Do 陳述式來跳離迴圈。因為通常您只會希望在某些特定的情形發生時,才要跳離迴圈,比如像要避免無窮迴圈時,您應該把Exit Do 陳述式放在 If...Then...Else 陳述式的 True 區塊中。當條件是 False 時,迴圈就會照常執行。在下面的例子中,myNum 將會被指定成一個會造成無窮迴圈的值。其中的 If...Then...Else 陳述式將會檢查這個條件,以避免無窮迴圈的發生。
 Sub ExitExample()
     Dim counter, myNum
     counter = 0
     myNum = 9
     Do Until myNum = 10
         myNum = myNum - 1
         counter = counter + 1
         If myNum < 10 Then Exit Do
     Loop
     MsgBox "The loop made " & counter & " repetitions."
 End Sub
使用 While...Wend
在 VBScript 中有提供 While...Wend 陳述式,這是為了用慣了 While...Wend 陳述式的使用者所提供的。不過,因為使用 While...Wend 較缺乏彈性,所以我們還是建議您使用 Do...Loop 來取代。
使用 For...Next
您可以使用 For...Next 陳述式使一整區塊的陳述式重複執行某個固定的次數。在 For 迴圈中,有一個用來當作計數器的變數。每執行一次迴圈時,這個變數的值就會遞增或是遞減。舉例來說,下面的程序將會呼叫 MyProc 程序 50 次。這個 For 陳述式指定了一個計數器變數 x,還有其起始值和結束值。Next 陳述式會使計數器的值遞增 1。
 Sub DoMyProc50Times()
     Dim x
     For x = 1 To 50
         MyProc
     Next
 End Sub
使用 Step 關鍵字,您就可以隨您的需要來遞增或遞減計數器變數。在下面的例子中,計數器變數 j 會在每次迴圈執行後遞增 2。當迴圈執行完時,變數 total 將是 2、4、6、8 和 10 的總合。
 Sub TwosTotal()
     Dim j, total
     For j = 2 To 10 Step 2
         total = total + j
     Next
     MsgBox "The total is " & total
 End Sub
如果您要使計數器變數遞減,您可以使用負的 Step 值。此時,結束值必須小於起始值。在下面例子中,計數器變數 myNum 會在每次迴圈執行過後遞減 2。當這個迴圈結束時,變數 total 的值將會是 16、14、12、10、8、6、4 和 2 的總合。
 Sub NewTotal()
     Dim myNum, total
     For myNum = 16 To 2 Step -2
         total = total + myNum
     Next
     MsgBox "The total is " & total
 End Sub
您可以使用 Exit For 陳述式在計數器到達其結束值之前跳離 For...Next 陳述式。因為通常您只會希望在某些特定的情形發生時,才要跳離迴圈,比如像發生錯誤時。所以您應該把 Exit Do 陳述式放在 If...Then...Else 陳述式的 True 區塊中。當條件是 False 時,迴圈就會照常執行。
使用 For Each...Next
For Each...Next 和 For...Next 迴圈非常相似。它們的不同之處在於,For Each...Next 迴圈是針對集合物件中的每一個物件或陣列中的每一個元素重複執行一次迴圈,而後者是依指定的數字重複執行迴圈的次數。當您不知道集合物件中有幾個元素時,For Each...Next 迴圈會特別的有用。在下面的 HTML 程式碼範例中,Dictionary 物件的功用是要將文字放到數個文字方塊中:
 <HTML>
 <HEAD><TITLE>Forms and Elements</TITLE></HEAD>
 <SCRIPT LANGUAGE="VBScript">
 <!--
 Sub cmdChange_OnClick
    Dim d                   'Create a variable 
    Set d = CreateObject("Scripting.Dictionary")
    d.Add "0", "Athens"     'Add some keys and items
    d.Add "1", "Belgrade"
    d.Add "2", "Cairo"

    For Each I in d
        Document.frmForm.Elements(I).Value = D.Item(I)
    Next
 End Sub
 -->
 </SCRIPT>
 <BODY>
 <CENTER>
 <FORM NAME="frmForm"

 <Input Type = "Text"><p>
 <Input Type = "Text"><p>
 <Input Type = "Text"><p>
 <Input Type = "Text"><p>
 <Input Type = "Button" NAME="cmdChange" VALUE="Click Here"><p>
 </FORM>
 </CENTER>
 </BODY>
 </HTML>

VBScript 條件式


使用 If...Then...Else 做選擇

If...Then...Else 陳述式依據條件是 True 或是 False,來執行一個或更多個陳述式。
條件通常是比較運算式,比較兩個數值或變數。
If...Then...Else 陳述式能使用多層巢狀結構。

看門(guard)

若您在條件為 True 時只要執行一個陳述式,您就可以使用 If...Then...Else 陳述式的單行語法。下面就是一個單行語法的範例。請注意,這個範例省略了 Else 關鍵字。
Sub FixDate()
     Dim myDate
     myDate = #2/13/95#
     If myDate < Now Then myDate = Now
 End Sub
如果您要執行超過一行以上的程式碼時,您就必須使用多行(或區塊)語法。這個語法包含了一個 End If 陳述式,如下例所示:
 Sub AlertUser(value)
     If value = 0 Then
         AlertLabel.ForeColor = vbRed
         AlertLabel.Font.Bold = True
         AlertLabel.Font.Italic = True
     End If
 End Sub
在條件是 True 時執行某幾個陳述式,條件是 False 時執行其它的陳述式
您可以使用 If...Then...Else 陳述式來定義兩個執行區塊:一個區塊在條件是 True 時執行,另一個則是在條件是 False 時執行。
 Sub AlertUser(value)
     If value = 0 Then
         AlertLabel.ForeColor = vbRed
         AlertLabel.Font.Bold = True
         AlertLabel.Font.Italic = True
     Else
         AlertLabel.Forecolor = vbBlack
         AlertLabel.Font.Bold = False
         AlertLabel.Font.Italic = False
     End If
 End Sub
在多種選擇中做決定
一個 If...Then...Else 陳述式的變形可以讓您從多種選擇中選取一種選擇。加上 ElseIf 子句的 If...Then...Else 陳述式可以擴充其功能,這樣能讓您的程式有多種不同的流程。舉例來說:
 Sub ReportValue(value)
     If value = 0 Then
         MsgBox value
     ElseIf value = 1 Then
         MsgBox value
     ElseIf value = 2 then
         Msgbox value
     Else
         Msgbox "Value out of range!"
     End If

您可以依您所需的加上多個 ElseIf 子句以提供其它選項。ElseIf 子句用的太多常常會變成一種麻煩。一個在多種選項之中選擇的較佳辦法是使用 Select Case 陳述式。

使用 Select Case 做選擇

Select Case 結構提供了 If...Then...ElseIf 外的另一種方式,可從多個陳述式區塊中選擇一個出來執行。
Select Case 陳述式和 If...Then...Else 陳述式類似,但可使程式更加有效率,且可讀性更高。

Select Case 結構在其前端有一個測試運算式,運算式只會被執行一次。執行完的結果將被拿來和每一個 Case 的值做比較。如果相符時,這個Case 區塊中的陳述式就會被執行:
Select Case Document.Form1.CardType.Options(SelectedIndex).Text
    Case "MasterCard"
        DisplayMCLogo
        ValidateMCAccount
    Case "Visa"
        DisplayVisaLogo
        ValidateVisaAccount
    Case "American Express"
        DisplayAMEXCOLogo
        ValidateAMEXCOAccount
    Case Else
        DisplayUnknownImage
        PromptAgain
End Select
請注意到 Select Case 結構只在前端執行一個運算式。相反的, If...Then...ElseIf 結構則可在每一個 ElseIf 陳述式後面執行一個不同的運算式。只有在每一個ElseIf 陳述式使用的都是同一個運算式時,您才能用 Select Case 結構取代 If...Then...ElseIf 結構。

VBScript 運算子

VBScript 具有完整的運算子,包括算術運算子比較運算子連結運算子邏輯運算子
運算子的優先權

當一個運算式中有數個動作發生時,各部分的動作會在預先決定的順序下完成,而此順序就是運算子的優先順序。括號則可推翻優先順序的等級,並且強迫運算式的某些部分必須優先執行。括號內要比括號外部的先執行。然而,括號中運算子的優先順序與正常情況是一樣的。當運算式有超過一種運算子時,會先執行算術運算子,其次是比較運算子,而後才是邏輯運算子。比較運算子的優先順序全都是相同的,也就是說依照出現的順序由左到右依序執行。而算術和邏輯運算子則必須依照下列的優先順序,依序執行:
算術比較邏輯
描述符號描述符號描述符號
指數運算^相等=NotNot
負數-不等<>AndAnd
乘法*小於<OrOr
除法/大於>XorXor
整數除法\小於或相等<=EqvEqv
ModMod大於或相等>=ImpImp
加法+IsIs  
減法-    
字串連結&    
若乘法和除法同時存在於運算式中,則計算時的順序就是依照其由左到右的位置來決定。同樣地,若加法和減法同時存在於一個運算式中,計算時的順序就是依照其由左到右的位置來決定。
字串連結運算子 (&) 不是算術運算子,但是在優先順序上它會落在所有算術運算子之後,且在所有比較運算子之前。Is 運算子是一個物件引用比較運算子。它並非比較物件或是它們的值;而是檢查兩個物件是否引用到相同的物件。

VBScript 常數

常數是一個用來取代固定數字或固定字串的有意義名稱。VBScript 定義了許多內建常數

建立常數

在 VBScript 中,您可以使用 Const 陳述式建立使用者自訂的常數。藉由 Const 陳述式,您就可以使用一個有意義的名稱來建立一個字串或數字常數,並給它們指定值。舉例來說,像:
Const MyString = "This is my string." 
Const MyAge = 49


請注意,字串文字是放在引號(" ")中。引號是分辨字串值和數值最明顯的一個方法。日期表示式和時間表示式則都需用井字符號(#)把它們括起來。比如像:
Const CutoffDate = #6-1-97#

您可以採用不同的命名結構來辨別常數和變數。這樣做可以避免您在執行 script 時犯下重複指定常數值的錯誤。舉例來說,您可以在常數名稱前加上「vb」或「con」當作字首,或者常數名稱全部用大寫字母來命名。當您在開發比較複雜的 script 時,區分常數和變數可以減少不少困擾。

VBScript 程式撰寫規格

什麼是程式撰寫規格?
程式撰寫規格包含了下列數項:
  • 物件、變數和程序的命名規格
  • 寫註解時的規格
  • 文字格式和縮排的使用原則
使用一致的程式撰寫規格之主要理由在於可以標準化一個 script 或一組 script 的架構和程式碼樣式。如此一來,您和其它人便可以輕鬆地了解這些程式碼的意義。使用良好的程式撰寫規格,可提高原始程式碼的精確度、可讀性和清晰度,而且可使它與其他程式語言規格更具一致性和直覺性。
常數命名規格
早期的 VBScript 版本不能建立使用者自訂常數。如果需要使用常數時,通常都是以一變數來當作常數,同時使用全部大寫的字母來命名以和一般的變數區別。而每個字之間則使用底線( _ )字元來做區隔。比如像:
 USER_LIST_MAX
 NEW_LINE
雖然現在這仍是一個辨別常數的可行辦法,但因為現在可以使用 Const 陳述式來建立一個真正的常數,所以您可能會希望改用另一種命名的架構。這個方式混合了大小寫字母,同時在常數之前加了一個「con」當作字首。比如像:
 conYourOwnConstant
變數命名規格
為了維持程式的可讀性和一致性,請您在您的 VBScript 程式碼內的變數名稱前,加上下述的字首。
子型態字首範例
BooleanblnblnFound
BytebytbytRasterData
Date (Time)dtmdtmStart
DoubledbldblTolerance
ErrorerrerrOrderNum
IntegerintintQuantity
LonglnglngDistance
ObjectobjobjCurrent
SinglesngsngAverage
StringstrstrFirstName
變數的有效範圍
變數應該盡可能的定義在最小的有效範圍之中。VBScript 變數有下列幾種有效範圍:
有效範圍變數宣告的地點可視性
程序層級事件,函數,或 Sub 程序可見範圍在其宣告的程序中
Script 層級HTML 網頁的 HEAD 區段,需寫在所有程序之外Script 中的每一個程序都可見
變數有效範圍字首
當 script 很大時,加上變數有效範圍字首將可以快速區別變數的有效範圍。一個置於型態字首之前的單一字母之有效範圍字首可以幫我們做到這點,同時又不會過度的增加變數名稱的長度。
有效範圍字首範例
程序層級不必加dblVelocity
Script 層級ssblnCalcInProgress
有說明性的變數和程序名稱
變數和程序名稱應該使用大小寫混合的命名名稱,同時這個名稱應該盡可能地能夠說明變數的用途。此外,程序名稱應該以動詞開頭,比如像 InitNameArray 或 CloseDialog。對於一些經常使用的長名詞,我們建議您使用標準的縮寫,以免名稱過長。一般來說,名稱長度如果超過 32 個字元就很難閱讀。當您使用縮寫時,請在全部的 script 中都保持相同的縮寫方式。舉例來說,如果您在一個 script 或一組 script 中時而用 Cnt,時而用 Count,那麼有時可能會造成困擾。
物件命名規格
下清單格列出了您在撰寫 VBScript 時會遭遇的物件型態及建議的命名規格。
物件型態字首範例
3D PanelpnlpnlGroup
Animated buttonanianiMailBox
Check boxchkchkReadOnly
Combo box, drop-down list boxcbocboEnglish
Command buttoncmdcmdExit
Common dialogdlgdlgFileOpen
FramefrafraLanguage
Horizontal scroll barhsbhsbVolume
ImageimgimgIcon
LabellbllblHelpMessage
LinelinlinVertical
List BoxlstlstPolicyCodes
SpinspnspnPages
Text boxtxttxtLastName
Vertical scroll barvsbvsbRate
SlidersldsldScale
程式註解規格
所有的程序都應該以一簡短的註解當作開頭來解釋程序的功用。這些說明不必解釋程式製作的細節(它怎麼做到的), 因為這些內容可能時時會改變。如此一來,您就不必做一些不必要的註解維護工作,或是讓您的註解錯誤百出。這些程式碼本身和所有必要的行間註解就足以說明製作的方式。當要傳遞到程序中的引數之目的不是很明顯時,或是程序預期引數的值應該介於某個範圍之間時,您就應該在註解中說明。函數的傳回值以及會被程序更動的變數,特別是經由引用的引數,也都應該寫在程序的前頭的註解中。
程序的開頭註解應該包含下列幾個區段標題。您可以參考以下「格式化您的程式碼」中的例子。
區段標題註解內容
目的(Purpose)程序的功用(不是如何達成其功用)。
假設(Assumptions)列出任何會影響這個程序的外部變數、控制項或其它元件。
影響(Effects)列出這個程序會影響的任何外部變數、控制項或其它元件。
輸入(Inputs)解釋每一個沒有明顯功能的引數。每一個引數都應該自成一行,同時使用行間註解。
傳回值(Return Values)解釋傳回值的意義。
請記得下列幾個要點:
  • 每一個重要變數的宣告都應該伴隨著一個行間註解來說明變數的功用。
  • 變數、控制項和程序的名稱都應該要令人可以一目了然。行間註解只需要用在一些較複雜的程式細節部分。
  • 在 script 的開頭,您應該包含一段描述整個 script 的概觀,同時列舉物件、程序、演算法、對話方塊以及其它和系統相關的事項。有時用一段虛擬碼來說明演算法可能會有不小的幫助。
格式化您的程式碼
盡可能保留螢幕的空間,但是同時要讓您的程式格式可以反映程式的邏輯結構和巢狀架構。這裡有幾個要點:
  • 標準的巢狀區塊應該用四個空格縮排。
  • 一個程序的概觀註解應該用一個空格縮排。
  • 緊接在概觀註解後的最高層級陳述式應該要用四個空格縮排,其中的巢狀區塊則再用四個空格縮排。下面是一個例子:

 '*********************************************************
 ' Purpose:  Locates the first occurrence of a specified user 
 '           in the UserList array.
 ' Inputs:   strUserList():   the list of users to be searched.
 '           strTargetUser:   the name of the user to search for.
 ' Returns:  The index of the first occurrence of the strTargetUser 
 '           in the strUserList array. 
 '           If the target user is not found, return -1.
 '*********************************************************

 Function intFindUser (strUserList(), strTargetUser)
     Dim i                     ' Loop counter.
     Dim blnFound        ' Target found flag
     intFindUser = -1
     i = 0                     ' Initialize loop counter
     Do While i <= Ubound(strUserList) and Not blnFound
         If strUserList(i) = strTargetUser Then 
             blnFound = True   ' Set flag to True
             intFindUser = i   ' Set return value to loop count
         End If
         i = i + 1             ' Increment loop counter
     Loop
 End Function

VBScript 程序

VBScript 有二種不同的程序:Sub 程序和 Function 程序。
Sub 程序
Sub 程序是指一串 VBScript 陳述式,由 Sub 和 End Sub 陳述式所包圍,但執行後不傳回值。
Sub 程序可以代入引數(由呼叫的程序傳過來的常數、變數、或運算式)。若 Sub 程序不含任何引數,則須在 Sub 陳述式加上一個空括弧 ()。
下面的 Sub 程序使用二個內建的 VBScript 函數, MsgBox 和 InputBox,來顯示一些資訊給使用者。再根據這些資訊來計算結果。這些計算是使用一個 VBScript 的 Function 程序來完成的。在接下來的討論之後,會列出這個 Function 程序。
Sub ConvertTemp()
    temp = InputBox("Please enter the temperature in degrees F.", 1)
    MsgBox "The temperature is " & Celsius(temp) & " degrees C."
 End Sub


Function 程序

Function 程序是指一串 VBScript 陳述式,
由 Function 和 End Function 陳述式所包圍。

Function 程序與 Sub 程序相似,但會於執行後傳回值。

Function 程序可以帶入引數(由呼叫的程序傳過來的常數、變數、或運算式)。
若 Function 程序不含任何引數,則需在 Function 陳述式加上一個空括弧 ()。
Function 把傳回值指定給程序中的一個或多個陳述式。一般 Function 的傳回型態是 Variant。

在下例中,Celsius 函數是把華氏的度數轉成攝氏。當 ConvertTemp Sub 程序呼叫此函數時,把帶有引數值的變數傳給函數。而計算後的結果會傳回給呼叫的程序,並顯示在訊息方塊中。
 Sub ConvertTemp()
     temp = InputBox("Please enter the temperature in degrees F.", 1)
     MsgBox "The temperature is " & Celsius(temp) & " degrees C."
 End Sub

 Function Celsius(fDegrees)
     Celsius = (fDegrees - 32) * 5 / 9
 End Function

從程序傳入或獲得資料

資料透過引數傳給程序的。引數可當成是預留給傳送到程序的資料位置。可以用任何有效的變數名稱來作為參數命名。無論是建立一個 Sub 陳述式或 Function 陳述式,都必須在程序名稱之後加上括弧。任何在括弧內的引數都是以逗號來隔開的。例如,以下例子的 fDegrees 是預留給要傳到 Celsius 函數轉換的值:
 Function Celsius(fDegrees)
    Celsius = (fDegrees - 32) * 5 / 9
 End Function

要從程序中獲得資料,就得使用 Function。Function 程序可傳回值;Sub 程序不傳回值。

在程式碼中使用 Sub 和 Function 程序

在程式碼中,Function 必須使用於變數指定的右邊或放在運算式中。例如:

Temp = Celsius(fDegrees)


MsgBox "The Celsius temperature is " & Celsius(fDegrees) & " degrees."

從另一個程序中呼叫 Sub 程序時,您只要在程序名稱加上所需的引數即可,引數須以逗號來隔開。不一定要使用 Call 陳述式,但若您要使用它,引數必須包含於括弧中。下面二種呼叫 MyProc 程式的方法。一個是使用 Call 陳述式的,一個則沒有。而二者所做的事情是完全一樣的。
 Call MyProc(firstarg, secondarg)
 MyProc firstarg, secondarg
 請注意,當不使用 Call 陳述式呼叫時,括弧要省略。

VBScript 變數

什麼是變數?
變數代表一個指向電腦記憶體位置的預留空間。在這個空間中,您可以儲存一些在 script 執行過程中會變動的程式資訊。舉例來說,在某個網頁中,您可以建立一個稱做 ClickCount 的變數來儲存使用者用滑鼠點選某一個物件的次數。變數儲存在電腦記憶體中的哪個位置並不重要,重要的是您只需用變數的名稱即可檢視儲存在其中的值、或更改這個值。在 VBScript 中,基本資料型態就是 Variant
宣告變數
使用 Dim 陳述式、Public 陳述式、或 Private 陳述式在 script 中明確宣告一個變數。比如像:
 Dim DegreesFahrenheit
可以同時宣告多個變數,變數之間以逗號隔開即可。比如像:
 Dim Top, Bottom, Left, Right
在 script 中使用時宣告一個變數。不過一般來說,這並不是一個好的方法。因為您可能會在使用時拼錯了變數的名稱,而產生不可預期的執行結果。基於這個理由,您可以使用 Option Explicit 陳述式來要求所有變數都要明確宣告。您應該在 script 的開端都放上 Option Explicit 陳述式。
命名的限制
在 VBScript 中,變數的命名必須遵循一標準規則。一個變數名稱中:
  • 必須以字母開頭。
  • 中間不能包含句點(.)。
  • 不能超過 255 個字元。
  • 在宣告的有效範圍中必須唯一。
變數的有效範圍和生命週期
一個變數的有效範圍是由其宣告的地點來決定。當您在一個程序中宣告變數時,那麼就只有程序中的程式碼可以存取或更改這個變數的值。它有區域的有效範圍,同時稱之為程序層級變數。如果您是在程序之外宣告一個變數,那麼 script 中的所有程序將都能使用這個變數。這是一個 script 層級的變數,同時它有 script 層級的有效範圍。一個變數的存在時間稱之為變數的生命週期。一個 script 層級變數的生命週期是從變數被宣告開始一直到 script 執行完畢為止。而程序層級變數就只有在程序執行時會存在。當離開程序時,這些變數就會消失。當程序執行時,區域變數是一個用來暫存資料的絕佳選擇。您可以在許多個不同程序中宣告同樣名稱的區域變數,因為只有變數所在的程序才會認得該變數。
指定值給變數
指定值給變數所要使用的運算式如下:變數在運算式的左邊,您要指定給變數的值在右邊。舉例來說,像:
 B = 200
單一值變數和陣列變數
在大多數的情形下,您只會想指定單一個值給您宣告的變數。一個含有單一個值的變數稱為單一值變數。在某些情形中,指定數個相關的值給一個變數會比指定一個來得方便。此時,您就可以建立一個可以包含一群值的變數。這種變數稱之為陣列變數。 宣告陣列變數和宣告單一值變數是相同的,但是在宣告陣列變數時,您需要在變數名稱後面加上括號 ( )。在下面的例子中,我們宣告了一個含有 11 個元素的一維陣列:
 Dim A(10)
雖然在括號中的數字是 10,不過因為在 VBScript 中的所有陣列都是以零為基底的陣列,所以這個陣列實際上包含了 11 個元素。在以零為基底的陣列中,陣列的元素個數永遠是括號中的數字再加 1。這種類型的陣列稱為固定大小的陣列。您可以使用索引來指定值給陣列中的元素。索引的值由零開始,其最大值到 10。您可以用下列的方式把資料指定給陣列中的元素:
 A(0) = 256
 A(1) = 324
 A(2) = 100
 . . .
 A(10) = 55
同樣地,您也可以使用索引值來讀取特定陣列元素中的資料。比如像:
 . . . 
 SomeVariable = A(8)  
 . . . 
陣列並不一定要是一維陣列,它最大可以到達 60 維。不過大部分的人通常最多都只用到三或四維。宣告多維陣列的方法是在括號中填入陣列各個維度的大小,而每個數字之間是以逗號隔開。在下面的例子中,MyTable 這個變數是一個二維陣列,它包含了 6 個資料列和 11 個資料行:
 Dim MyTable(5, 10)
在一個二維的陣列中,第一個數字代表資料列的數目;第二個則代表資料行的數目。您也可以宣告一個在 script 執行過程中大小會改變的陣列。這種陣列稱之為動態陣列。在程序中,您可以用 Dim 陳述式或 ReDim 陳述式來宣告動態陣列。然而在動態陣列的宣告中,括號內不必填入任何維度或陣列的大小。比如像:
 Dim MyArray()
 ReDim AnotherArray()
當您要使用動態陣列時,您必須先使用 ReDim 來決定陣列的維度以及每個維度的大小。在下面的例子中,ReDim 首先將動態陣列的起始大小設為 25,之後的ReDim 陳述式則將大小修改為 30,同時它使用了 Preserve 這個關鍵字,它可以在陣列大小改變時,使原來儲存在陣列中的資料得以保存。
 ReDim MyArray(25)
 . . . 
 ReDim Preserve MyArray(30)
動態陣列之大小變化的次數並沒有任何限制。不過,您應該注意的是,當您縮小陣列的大小時,存放在被刪除掉的元素中的資料都會消失不見。

VBScript 資料型態


VBScript 只有一種稱為 Variant 的資料型態。Variant 是一個很特殊的資料型態,它可以隨著被使用方法的不同而包含不同的資訊。因為 Variant 是 VBScript 中的唯一資料型態,所以它也是 VBScript 中所有函數傳回資料的唯一型態。

在這麼簡單的結構中,Variant 同樣可以包含數字或字串的資訊。當您在一個應該使用數字的地方使用 Variant 時,它就會被當成一個數字;當您在一個應該使用字串的地方使用 Variant 時,它就會被當成一個字串。這也就是說,當您使用一個看起來像數字的資料時,VBScript 就會假設它是數字,同時採取適當的處理。相同的,如果您使用的資料只能是字串資料時,VBScript 就會把它當成字串資料。當然,您可以在數字外加上引號(" ")強迫 VBScript 把它當成字串。
Variant 子型態
除了數值或字串的分別之外,Variant 還可以更進一步區分數值資訊的性質。舉例來說,您可以讓一個數值代表日期或時間。當它和其它日期或時間一起做運算時,其結果都會以日期或時間表示。當然,您還可以使用各種不同大小的數值資訊。它可以小如布林值,或大如浮點數。這些可以包含在 Variant 中的不同種類資訊稱為副型態。在大部分的情形下,您都可以直接把您所想用的型態放到 Variant 中,Variant 會以最適當的方式來處理其中所包含的資料。下面的表格中列出了 Variant 可以包含的子型態。
子型態描述
EmptyVariant 仍未初始化。數值變數將會是 0,字串變數則是長度為零的字串("")。
NullVariant 包含一個無效的資料。
Boolean包含 True 或 False
Byte包含 0 到 255 之間的整數。
Integer包含介於 -32,768 到 32,767 之間的整數。
Currency介於 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之間。
Long包含介於 -2,147,483,648 到 2,147,483,647 之間的整數。
Single包含一個單精度浮點數,其負數的範圍介於 -3.402823E38 到 -1.401298E-45 之間;正數的範圍則介於 1.401298E-45 到 3.402823E38 之間。
Double包含一個雙精度浮點數,其負數的範圍介於 -1.79769313486232E308 到 -4.94065645841247E-324 之間;正數的範圍則介於 4.94065645841247E-324 到 1.79769313486232E308 之間。
Date (Time)包含一個代表日期的數值,其值介於西元 100 年 1 月 1 日到西元 9999 年 12 月 31 日之間。
String包含一個可變長度的字串,其長度最長可以到將近 20 億個字元。
Object包含一個物件。
Error包含一個錯誤代碼。
您可以使用轉換函數來轉換資料的子型態。此外,VarType 函數可以傳回儲存在 Variant 中的資料。