1 VBScript基础
1.1 Option Explicit
将Option Explicit
语句放到脚本的开头,所有的其他语句之前。这就是告诉VBScript
,代码要求所有的变量在使用之前都必须先显式地声明
。现在 VBScript 就不再会允许您在代码中不做声明就引入新的变量
如果使用了Option Explicit
,但是没有声明变量VBScript
会终止运行,并提示以下错误: Variable is undefined: 'lgnSecond'
。这是个好消息,因为现在就知道要修复这个错误。只要使用了 Option Explicit
语句, VBScript
就会捕获变量的输入错误
2 函数和过程
2.1 过程
作为过程的具名代码块是用 Sub
关键字来识别的。Sub
是subprocedure
的缩写,这是“p
rocedure”的另一种说法。
用下面的语法声明过程:
[Public|Private] Sub Name ([Argument1],[ArgumentN])
[ code inside the procedure ]
End Sub
2.2 函数
函数的语法跟过程的语法是一样的,唯一的区别在于将关键字Sub
改为 Function
。
[Public|Private] Function Name ([Argument1],[ArgumentN])
[ code inside the function ]
End Function
2.3 调用过程和函数
2.3.1 过程调用
- 这两种合法的方式在功能上是等价的,选择哪一种主要取决于自己的喜好。
- 有些人说第二种方式(使用
Call
关键字)更清晰,但也有人讨厌打更多的字。 - 有些人喜欢第二种方式是因为它更像
VBScript
的前辈BASIC
编程语言。 - 两个方式都很常见, Visual Basic 和 VBScript程序员对这两者都很习惯。
- 在调用过程(相对的则是函数)时,若选择不使用
Call
关键字,那就不能将传递给该过程的参数放在圆括号
中。 - 同样,如果要使用
Call
关键字,那么圆括号就是不可缺少的。这就是使用方法
2.3.2 函数调用
2.4 退出过程或函数
- 在过程或函数内部的最后一行代码运行完之后自然就会退出。
- 有时您需要立即结束一个过程而不是等到代码全部运行完。
- 可以使用
Exit Sub
语句(过程),也可以使用Exit Function
语句(函数)。 - 只要出现
Exit
语句,那么代码的流程就会返回到调用者。
3 变量作用域和声明
3.1 变量作用域
在 VBScript 中有三种变量作用域:
脚本级(script-level)作用域
:变量在整个脚本文件的代码中都是有效的。在脚本文件(比如 Windows 脚本宿主的.VBS 文件或是活动服务页面的.ASP 文件)―主体‖中声明的变量的作用域就是整个脚本。过程级(procedure-level)作用域
:变量在过程或函数中有效。过程之外的其它代码,甚至是同一个脚本文件中的代码也不能访问过程级变量。过程级作用域也被称为―局部‖作用域,程序员通常将被声明为过程级的变量称为―局部变量‖。类级(class-level)作用域
:这是一种包含属性和方法的逻辑分组的特殊结构。在 VBScript 中,脚本中用Class...End Class
代码块定义类。类定义的主体中用Private
语句声明的变量的作用域就是类级的。意思就是类中的其他代码可以访问这个变量,但是类定义之外的代码,即使是同一个脚本文件中的代码也不能访问这个变量。
3.2 变量声明
有三种语句可以用于声明变量: Dim
、 Private
和 Public
。
Dim
:这个语句用于声明脚本或过程级作用域的变量。所有被声明为脚本级的变量自动地在整个脚本文件中有效,无论使用的是 Dim、 Private 还是 Public。要声明过程内部的变量(也就是局部变量),必须使用Dim
。不能在过程内部使用 Public 和Private
。如果用于类级的变量, Dim 的效果跟 Public 是完全相同的。Private
:可以在脚本或类级作用域使用Private
语句,但是不能在过程或函数内部使用。如果用于脚本级变量,它的作用跟 Dim 和 Public 是完全相同的。所有在脚本级声明的变量都自动地在整个脚本文件中有效,无论使用 Dim、 Private 还是 Public。尽管 VBScript 不需要它,但还是有很多程序员喜欢用 Private 语句声明脚本级的变量,而将 Dim 保留用于过程或函数中的局部变量。为了声明一个私有的类级变量,必须要用 Private。所有在类级用 Dim 或 Public 声明的变量在整个类中都是一个有效的公共属性。Public
:可能会用 Public 语句声明脚本级作用域的变量,但是在效果上它跟 Dim 或 Private 是一样的。Public 真正有意义的地方就在于类
。用 Public 声明的类级变量就是这个类的公共属性。 Public 在脚本级没有意义(脚本构件(script component))的原因就在于变量在其存在的脚本文件外是没有用的。所以,Public 唯一有意义的就是创建类的公共属性
。但要注意,很多 VBScript 程序员不鼓励在类中使用 Public 变量,而喜欢使用 Private 类级变量和Property Let
、Set
和Get
过程的组合。
这三点中包含了很多规则
4 流程控制
4.1 分支结构
4.1.1 if分支
If...End If
结构可以很简单,也可以变得比较复杂。其最简形式的语法如下。
If < expression > Then
< other code goes here >
End If
< expression >
中可以使用任何结果是True
或False
的语句(也就是布尔表达式)。可以是一个数学等式
下面是一串对不同表达式求值的 ElseIf
代码块
If boolFirst Then
< other code goes here >
ElseIf boolSecond Then
< some other code goes here >
ElseIf boolThird Then
< some other code goes here >
ElseIf lngTest = 1 Then
< some other code goes here >
ElseIf strName = ―Bill‖ Then< some other code goes here >
End If
4.1.2 Select Case 分支
Select...End Select
的语法如下:
Select Case < expression >
Case <possibility 1>
< code goes here >
Case <possibility 2>
< other code goes here >
Case <possibility 3>
< other code goes here >
Case <possibility n>
< other code goes here >
Case Else
< other code goes here >
End Select
注意:
这是对同一个表达式多次求值, 而If...ElseIf...End If
可以对不同的表达式求值。还要注意在完成所有测试后,还可以有一个可选的 Case Else
,如果其它的选项都没有返回 True
时就会执行这个代码块
4.2 循环结构
4.2.1 For…Next
For…Next
循环适用于两种情况:
- 代码反复执行的次数已知。
- 对诸如数组、文件或数据库表等复杂数据结构中的每个元素执行一段代码(但是
For Each…Next
循环是专门为另外一种复杂数据结构,集合(collection)设计的)。先来看看如何使用 For…Next 循环将一段代码执行若干次
Option Explicit
Dim lngIndex
For lngIndex = 1 To 5
MsgBox "Loop Index: " & lngIndex
Next
首先要注意,要使用 For…Next
循环就需要一个循环变量—— 也就是循环索引(loop index
)。 lngIndex
变量就是这个功能。语句 For lngIndex = 1 To 5
意思就是这个循环会执行 5次。您可以从这些对话框中看到, lngIndex 的值逐步地从 1 增加到 5。在完成第 5 次循环后,
循环结束,代码继续运行。注意,并不一定要从 1 开始执行 5 次循环(FOR_LOOP_NOT_ ONE.VBS)
还可以用 Step
关键字跳过某些数字,就是每次步长的增长值
4.2.1.1 跳出循环
Exit For
语句随时终止循环
4.2.2 For Each…Next
For Each…Next
循环是一种特殊的循环,专门用于遍历集合。集合(collection),顾名思义,就是数据的集合,很像一个数组。集合中通常含有同一类型的对象(尽管集合也可以存放各种类型的数据)。
例如, VBScript 的内建运行时对象FileSystemObject
是 Folder
对象,表示文件系统中的目录。 Folder 对象有一个 Files 集合,表现为一个属性。在 Folder.Files 集合中可能会有若干的 File 对象。可以用For Each…Next
循环遍历 Folder.Files
集合中的每个 File 对象。For Each…Next
循环中不能直接控制循环次数
4.2.3 Do Loop
Do
循环是最通用的循环结构。因为可以非常方便地用它根据任何所需的标准来设定循环次数
Do 循环的威力来自于While 和 Until
关键字。 While 和 Until 既可以用在循环的开始,也可以用在循环的结尾来控制是否要再次执行循环。看一下这个使用 Do 循环的简单例子
Option Explicit
Dim boolLoopAgainDim lngLoopCount
Dim strResponse
boolLoopAgain = False
lngLoopCount = 0
Do
boolLoopAgain = False
lngLoopCount = lngLoopCount + 1
strResponse = InputBox("What is the magic word?")
If UCase(Trim(strResponse)) = "PLEASE" Then
MsgBox "Correct! Congratulations!"
Else
If lngLoopCount < 5 Then
MsgBox "Sorry, try again."
boolLoopAgain = True
Else
MsgBox "Okay, the word we wanted was "Please"."
End If
End If
Loop While boolLoopAgain
4.2.3.1 在 Until 和 While 之间做出选择
while
是false
终止循环,是true
开始下一次循环,而until
刚好相反,true
是终止循环,false
是开始下一次循环
4.2.3.2 跳出 Do 循环
Exit Do
语句。跟Exit For
类似,可以用Exit Do
随时跳出 Do
循环。在循环中可以有很多 Exit Do
语句
4.2.4 While…Wend
While…Wend
循环是一种来自老版本的 BASIC 和 Visual Basic
的老式语法。相对于不太通用的While…Wend
循环,程序员通常更喜欢用 Do 循环。
这并不是说就绝对不能使用 While…Wend
循环,还是有不少程序员在使用它。它能运行,简单,而且没有任何迹象表明微软会停止支持它。它只是有些跟不上时代。为了保持内容的完整,下面是一个While…Wend
语法的例子
Option Explicit
Dim lngCounter
lngCounter = 0
While lngCounter <= 20
lngCounter = lngCounter + 1
'< other code goes here >
Wend
跟 Do
循环不一样,这里不需要使用 While 或 Until
,也不能将条件放在循环的结尾。判断是否继续循环的条件只能放在循环的开头
。最后, While…Wend
最主要的限制就是它没有等价于 Exit For
或 Exit Do
的语句,这意味着不能强行跳出循环