VBScript

VBScript（"Microsoft Visual Basic Scripting Edition"）是微软以 Visual Basic 为蓝本开发的一种已废弃的动态脚本语言。它允许 Microsoft Windows 系统管理员生成用于管理计算机的强大工具，无需错误处理，并具有子程序和其他高级编程结构，亦让用户能够控制诸多计算环境。2023年，微软宣布弃用VBScript。2024年5月，发布VBScript阶段移除计划，2027年后不再预设启用，并且未来的Windows版本也会永久移除VBScript。

## 使用范围

由于VBScript可以通过Windows Script Host调用COM，因而可以使用Windows操作系统中可以被使用的程序库，比如它可以使用Microsoft Office的库，尤其是使用Microsoft Access和Microsoft SQL Server的程序库，当然它也可以使用其它程序和操作系统本身的库。在实践中VBScript一般被用在以下三个方面：

### 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）。

### 网页浏览器（客户端的VBS）

网页中的VBS可以用来控制客户端的网页浏览器（以浏览器执行VBS程序）。VBS与JavaScript在这一方面是竞争者，它们可以用来实现动态HTML，甚至可以将整个程式结合到网页中来。

至今为止VBS在客户方面未能占优势，因为它只获得Microsoft Internet Explorer的支持（Mozilla Suite可以透过安装一个套件来支援VBS），并且IE11起已不再支持VBScript。而JavaScript则受到所有网页浏览器的支援。在Internet Explorer中VBS和JavaScript使用同样的权限，它们只能有限地使用Windows操作系统中的对象。

### 网页服务器（服务器方面的VBS）

在网页服务器方面VBS是微软的Active Server Pages的一部分，它与JavaServer Pages和PHP是竞争对手。在这里VBS的程序码直接嵌入到HTML页内，这样的网页以ASP结尾。网页服务器Internet信息服务执行ASP页内的程序部分并将其结果转化为HTML传递给网页浏览器供用户使用。这样服务器可以进行数据库闻讯并将其结果放到HTML网页中。

## 示范

### Hello World

最简单的例子：

```vb
MsgBox "Hello World"
```

以`.vbs`文件保存。再使用`cscript.exe`或`wscript.exe`执行。

一个更复杂的例子中，示出了使用`MsgBox`作为函数（返回一个结果），并使用了三个参数，其中第二个参数使用的是常量。

```vb
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
```

### 终止任务

VBScript能访问Windows管理规范 (WMI)，就像Windows任务管理器。以下的代码执行时将会终止（“杀掉”）任何关于notepad.exe的进程。

```vb
'Terminate all processes involving the name <strProcessToKill>
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的最佳实践。

### 创建具有唯一的名称的十个文件

这个实例显示如何创建文件并向它添加内容。它还演示了字符串连接。

```vb
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
```

### 发送按键

SendKeys方法模拟一个或多个按键到活动窗口（模拟在键盘上输入）。在该示例中，脚本发送字符串“Hello World！”3次，每次暂停2秒（2000毫秒）。SendKeys宏可能会在某些程序中失效，因为一些软件（如在安装时输入许可证密钥）将检查是否是真正的按键，而不是虚拟的。

```vb
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!”将显示在命令提示符。

### Windows文件操作

对象FileSystemObject执行一些文件操作（例如测试一个文件是否存在），并且还创建一个文本文件（一个TextStream对象）。

```vb
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:\ 驱动器根目录创建（若已经存在则更新）一个小文本文件。

### Excel对象操作

```vb
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的对比

### 不能为变量定义类型

在VB中，为变量定义类型使用“Dim 变量名 As 类型”的语句格式。

但是在VBScript中这样写是错误的，VBScript中的变量都是弱类型（即Variant变体），因此它不需要指定类型。只能使用“Dim 变量名”的格式，解释器会自动根据赋值的类型定义变量类型。

### 不能使用条件编译

在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的程序码不被用户看到。

## 外部链接

- VBScript User's Guide
- VBScript Language Reference

## 基本资料

- 文件扩展名：.vbs, .vbe, .wsf, .wsc (.hta, .htm, .html, .asp)
- 发行时间：1996年
- 开发者：微软
- 软件实现：Windows Script Host, Active Server Pages
- 受影响于：Visual Basic
- 施影响于：Windows PowerShell
- 操作系统：Windows