VBScript

VBScript（"Microsoft Visual Basic Scripting Edition"）是微軟以 Visual Basic 為藍本開發的一種已廢棄的語言。它允許 Microsoft Windows 系統管理員生成用於管理計算機的強大工具，無需錯誤處理，並具有子程式和其他高階程式設計結構。它可以讓使用者完全控制計算環境的許多方面。2023 年，微軟發布 VBScript 棄用 (deprecated)。2024 年 5 月，發布階段移除計畫，2027 年移除。

使用範圍

由於 VBScript 可以透過 Windows Script Host 呼叫 COM，因而可以使用 Windows 作業系統中可以被使用的程式庫，比如它可以使用 Microsoft Office 的庫，尤其是使用 Microsoft Access 和 Microsoft SQL Server 的程式庫，當然它也可以使用其它程式和作業系統本身的庫。在實踐中 VBScript 一般被用在以下三個方面：

1.1 Windows 作業系統

VBScript 可以被用來自動地完成重複性的 Windows 作業系統任務。在 Windows 作業系統中，VBScript 可以在 Windows Script Host 的範圍內執行。Windows 作業系統可以自動辨認和執行 .VBS 和 .WSF 兩種檔案格式，此外 Internet Explorer 可以執行 HTA 和 CHM 檔案格式。VBS 和 WSF 檔案完全是文字式的，它們只能透過少數幾種對話視窗與使用者通訊。HTA 和 CHM 檔案使用 HTML 格式，它們的程式碼可以像 HTML 一樣被編輯和檢查。在 WSF、HTA 和 CHM 檔案中 VBScript 和 JavaScript 的程式碼可以任意混合。HTA 檔案實際上是加有 VBS、JavaScript 成分的 HTML 檔案。CHM 檔案是一種，使用者可以使用專門的編輯程式將 HTML 程式編輯為 CHM。

Windows 作業系統也提供一些 VBScript 指令碼來進行高階管理功能，例如管理 Windows 啟用金鑰的 slmgr.vbs（Windows Server License Manager Script）。

1.2 網頁瀏覽器（客戶端的 VBS）

網頁中的 VBS 可以用來控制客戶端的網頁瀏覽器（以瀏覽器執行 VBS 程式）。VBS 與 JavaScript 在這一方面是競爭者，它們可以用來實現動態 HTML，甚至可以將整個程式結合到網頁中來。

至今為止 VBS 在客戶方面未能佔優勢，因為它只獲得 Microsoft Internet Explorer 的支援（Mozilla Suite 可以透過安裝一個套件來支援 VBS），並且 IE11 起已不再支援 VBScript。而 JavaScript 則受到所有網頁瀏覽器的支援。在 Internet Explorer 中 VBS 和 JavaScript 使用同樣的許可權，它們只能有限地使用 Windows 作業系統中的物件。

1.3 網頁伺服器（伺服器方面的 VBS）

在網頁伺服器方面 VBS 是微軟的 Active Server Pages 的一部分，它與 JavaServer Pages 和 PHP 是競爭對手。在這裡 VBS 的程式碼直接嵌入到 HTML 頁內，這樣的網頁以 ASP 結尾。網頁伺服器 Internet 資訊服務執行 ASP 頁內的程式部分並將其結果轉化為 HTML 傳遞給網頁瀏覽器供使用者使用。這樣伺服器可以進行資料庫聞訊並將其結果放到 HTML 網頁中。

示範

2.1 Hello World

最簡單的例子：

MsgBox "Hello World"

以.vbs 檔案儲存。再使用 cscript.exe 或 wscript.exe 執行。

一個更復雜的例子中，示出了使用 MsgBox 作為函式（返回一個結果），並使用了三個引數，其中第二個引數使用的是常量。

Dim x

' These three produce the same result. However, the use of constants as in the third line

' is considered best practice.

x = MsgBox ("Hello World:Text",1+64+4096,"Hello World:Title")

x = MsgBox ("Hello World:Text",4161,"Hello World:Title")

x = MsgBox ("Hello World:Text", vbOKCancel+vbInformation+vbSystemModal, _

"Hello World:Title")

' Presents the number corresponding to the button pressed. Different constants will produce

' different behaviours. For example, vbOKCancel specifies two buttons in the dialogue box,

' whereas vbYesNoCancel specifies three.

x = MsgBox ("Hello World:Text", vbYesNoCancel+vbInformation,"Hello World:Title")

MsgBox "The result is" & x

2.2 終止任務

VBScript 能訪問 Windows 管理規範 (WMI)，就像 Windows 任務管理器。以下的程式碼執行時將會終止（“殺掉”）任何關於 notepad.exe 的程序。

'Terminate all processes involving the name

Option Explicit

Dim strComputer, strProcessToKill, objWMIService, colProcess, objProcess

strComputer = "."

strProcessToKill = "notepad.exe"

Set objWMIService = GetObject ("winmgmts:" _

& "{impersonationLevel=impersonate}!\\" _

& strComputer _

& "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _

("Select * from Win32_Process Where Name = '" & strProcessToKill & "'")

For Each objProcess in colProcess

MsgBox "... terminating" & objProcess.Name

objProcess.Terminate

Next

使用 Option Explicit 並不是必須的，但它被認為是 VBScript 的最佳實踐。

2.3 建立具有唯一的名稱的十個檔案

這個例項顯示如何建立檔案並向它新增內容。它還演示了字串連線。

For i = 1 to 10

	createFile (i)

Next

Public sub createFile (a)

	Dim fso,myFile

	filePath = "C:\file_name" & a & ".txt"

	Set fso=CreateObject ("Scripting.FileSystemObject")

	Set MyFile= fso.CreateTextFile (filePath)

	MyFile.WriteLine ("This is a separate file")

	MyFile.close

End Sub

2.4 傳送按鍵

SendKeys 方法模擬一個或多個按鍵到活動視窗（模擬在鍵盤上輸入）。 在該示例中，指令碼傳送字串 “Hello World！”3 次，每次暫停 2 秒（2000 毫秒）。SendKeys 巨集可能會在某些程式中失效，因為一些軟體（如在安裝時輸入許可證金鑰）將檢查是否是真正的按鍵，而不是虛擬的。

set shl = createobject ("wscript.shell")

shl.sendkeys "Hello World!"

wscript.sleep 2000

shl.sendkeys "Hello World!"

wscript.sleep 2000

shl.sendkeys "Hello World!"

wscript.sleep 2000

執行期間，“Hello World!” 將顯示在命令提示符。

2.5 Windows 檔案操作

物件 FileSystemObject 執行一些檔案操作（例如測試一個檔案是否存在），並且還建立一個文字檔案（一個 TextStream 物件）。

myfilename = "C:\Wikipedia - VBScript - Example - Hello World.txt"

MakeHelloWorldFile myfilename

Sub MakeHelloWorldFile (FileName)

'Create a new file in C: drive or overwrite existing file

Set FSO = CreateObject ("Scripting.FileSystemObject")

If FSO.FileExists (FileName) Then

Answer = MsgBox ("File" & FileName & "exists ... OK to overwrite?", vbOKCancel)

'If button selected is not OK, then quit now

'vbOK is a language constant

If Answer vbOK Then Exit Sub

Else

'Confirm OK to create

Answer = MsgBox ("File" & FileName & "... OK to create?", vbOKCancel)

If Answer vbOK Then Exit Sub

End If

'Create new file (or replace an existing file)

Set FileObject = FSO.CreateTextFile (FileName)

FileObject.WriteLine "Time ..." & Now

FileObject.WriteLine "Hello World"

FileObject.Close

MsgBox "File" & FileName & "... updated."

End Sub

MakeHelloWorldFile 將會在按下按鈕後於 C:\ 驅動器根目錄建立（若已經存在則更新）一個小文字檔案。

2.6 Excel 物件操作

Option Explicit ' 所有變數必須顯式宣告

Dim app,workbook,sheet

Dim row,col

Set app = WScript.CreateObject ("Excel.Application")

app.Visible = True

Set workbook = app.WorkBooks.Add

Set sheet = workbook.Worksheets (1)

'10x10 random value

For row = 1 To 10

For col = 1 To 10

sheet.Cells (row,col).Value = CInt (Int ((100 * Rnd ) + 1))

Next

Next

Set sheet = workbook.Worksheets (2)

'10x10 random value

sheet.Range ("A1:J10").Formula = "=Int (Rand * 100 + 1)"

語言

VBScript 主要的優點有：

由於 VBScript 由作業系統，而不是由網頁瀏覽器解釋，它的檔案比較小。
易學。
在所有 2000 / 98SE 以後的 Windows 版本都可直接使用。
可以使用其它程式和可使用的物件（尤其是 Microsoft Office）。

缺點有：

現在 VBS 無法作為電子郵件的附件了。Microsoft Outlook 拒絕接受 VBS 為附件，收信人無法直接使用 VBS 附件。
VBS 的各種編輯器不受歡迎。
作業系統沒有任何特別的保護設施。VBS 程式與其它 JS、EXE、BAT 或 CMD 程式一樣對待。作業系統沒有監察惡意功能的能力。

和 VB 的對比

4.1 不能為變數定義型別

在 VB 中，為變數定義型別使用 “Dim 變數名 As 型別” 的語句格式。

但是在 VBScript 中這樣寫是錯誤的，VBScript 中的變數都是弱型別（即 Variant 變體），因此它不需要指定型別。只能使用 “Dim 變數名” 的格式，直譯器會自動根據賦值的型別定義變數型別。

4.2 不能使用條件編譯

在 VB 中，可以使用 #If…Then、#ElseIf…Then、#Else、#End If、#Const… = … 等語句定義編譯時使用的語句

而由於 VBScript 不需要編譯即可被 WSH（Windows Script Host）直接解釋執行，所以並不需要條件編譯語句。

安全性

微軟決定 Outlook 和 Outlook Express 中的 HTML 郵件可以使用 VBScript 後出現了許多利用 Windows Script Host 和 ActiveX 的功能的電腦病毒。這些病毒之所以能夠傳播開來也是因為一開始這些系統功能完全未受保護。雖然 VBScript 和 JavaScript 使用同樣的使用作業系統的功能的安全措施，今天這些功能被看作不符合標準。

一般很難保護 VBScript 的程式碼不被使用者看到。