当前位置:文档之家› 【windows 脚本系列】4. VBScript介绍

【windows 脚本系列】4. VBScript介绍

【windows 脚本系列】4. VBScript介绍
【windows 脚本系列】4. VBScript介绍

4. VBScript介绍

本章将提供一个对于VBScript(Microsoft Visual Basic的描述语言版本)的简短介绍给那些从来没有用过这种语言或是想要知道VBScript中特定语言结构(例如程序中的条件式If叙述)的使用者。

提示

Microsoft提供了〈VBScript程序语言参考〉和〈VBScript用户指南〉这两个有关VBScript详细信息的文件。随书光盘将他们放在\Docs\VBSDOC55文件夹中,但建议您可以从Microsoft的网站(h ttp://https://www.doczj.com/doc/973356878.html,/taiwan/products/develop/scripting/default.htm)下载最新版的文件。

基本功能

本节将介绍VBScript的基本功能。在本章的后半段,还会介绍更进阶的功能(包括一些第5版指令引擎所提供的功能)。

叙述、连续的行、与批注

VBScript是VBA(Microsoft Visual Basic for Application)的子集合,而VBA又是由Microsoft Office和Visual Basic所提供的。Microsoft从VBA用了好几个语言结构来定义VBScript的语法。如果你有过Visual Basic或Office程序设计的经验,那么VBScript程序设计对您而言应该不困难。

叙述(Statements)

您必须使用VBScript定义的语法规则来输入叙述。下列这几行是有效的VBScript叙述:

Value1 = 10

Value1 = Value1 + 10

If Value1 > 100 Then Value1 = 100

Tax = 0.1 : Price = Net * Tax

您可以在单行中输入多个叙述,只要使用冒号(:)将他们分隔开来即可,例如上面程序代码中的最后一行所示。无论如何,您应该谨慎地使用这种语法以增加您程序的可读性。

说明

VBScript的叙述和关键词是不区分大小写的(case insen-sitive),但是在JScript中则是相反的。

连续的行(Continued Lines)

太长的叙述会让您的Script不易阅读。下面这行用来显示讯息盒的叙述就比目前编辑窗口的宽度还长:

WScript.Echo "您在之前窗体的文本框中输入的名字

是错误的,请重新输入!"

如果一个程序包含很多行冗长的叙述,那么您将浪费时间在调整垂直滚动轴来编辑这几行。比较好的方法是附加一个空格符和底线符号(_)在该行结束的地方,并在下一行继续此叙述。如下所示:

WScript.Echo "您在之前窗体的文本框 " & _

"中输入的名字是错误的," & _

"请重新输入!"

当语言引擎侦测到某一行是以底线符号结尾时,他会假设有一个连续的行并将下一行视为目前叙述的一部份。

说明

这些连续行之最末行的最后面不必加上底线符号。同时您也不能在包含底线符号的行后面加上批注。如果您想在连续的行中使用一个很长的字符串,请将这个字符串分为数个子字符串并分别以双引号结尾。然后您便能够加入底线符号来分开这个叙述到好几行里面。您可以使用「&」操作数或「+」操作数来链接这些子字符串。在前面的叙述中曾使用了这种结构。

批注(Comments)

如同第1章曾提到过,若您想要告诉VBScript不要直译某一行或者是某个叙述的一部份,那么您只要把这个叙述标示成批注即可。在VBScript里面,您可以用单引号(')或REM叙述来标示批注。倘若VBScript直译器在叙述中侦测到这个字符,他将会忽略该行剩下的部分。下面这两行都是批注:

' 这一整行都是批注

Value1 = Net * Factor '在行末批注

第二行叙述的后面有一个批注。VBScript会执行这个叙述并且忽略批注的部分。VBScript程序结构

一个VBScript的程序可以由批注和叙述所组成。本书中使用的Script档案采用程序4-1的结构。

程序4-1 W SHDemo.vbs

'************************************************

' 档案:WSHDemo.vbs (WSH sample in VBScript)

' 作者:(c) G. Born

'

' 使用WSH来显示简单的对话盒

'************************************************

Option Explicit

Dim Message

' 变数初始化

Message = "快点,程序执行了!"

WScript.Echo Message

'*** 程序结束

如同前面章节所提到,在您的Script中加入批注是很好的程序设计训练。若您从其他程序设计师那里得到一个Script,而该作者又有在文件头注明程序的目的和其他信息,那么您肯定会很感激这位作者。

说明

您还可以在HTML文件中使用VBScript程序,并以M icrosoft Internet Explorer 来执行他们。虽然I nternet Explorer 和Microsoft WSH(Windows Script Host)使用同一个语言引擎,但他们却不是使用相同的对象(或者更明确地说,是相同的对象模型)。举例来说,I nternet Explorer 提供的事件处理在WSH环境中就不能够使用。因此在文件头注明他的语言、版本和用来设计Script的环境将会是很有帮助的。

常数和变数

在VBScript里,您可以使用常数和变量来储存值。接下来的几个小节将讨论如何定义常数和变量。

常数(Contants)

您肯定会在您的Script中用到常数。您可以在VBScript叙述中直接使用他们。下面的程序代码定义了一个常数:

result = price + 100.0

这个方程式把变量price加上100.0,然后将结果指定给result变量。这个数值100.0就是一个常数。这种技巧是很普遍的,而且容易阅读。但是他有一个很大的缺点。我们假设您的Script有好几百行,而这个数值100.0在很多行都有出现。如果您必须把100.0改成110.0,此时会发生什么事呢?您必须在原始码中修改用到这个常数的每一行。您可以使用编辑器的寻找/取代为... 功能,但是这样可能会花点时间而且可能会导致错误,因为数值100.0也许有不同的用途。

为了避免这个问题,您可以在VBScript程序的开头设定一个常数或标识符。这个用来取代数字和字符串的常数是一个有意义的名字,并且其值是不会改变的。您必须明确地宣告常数。在下面这几行程序代码中,我们用关键词Const来宣告常数。他的后面跟着常数的名称与其值:

Const profit = 100.0

您可以在VBScript程序的其他叙述中使用命名过的常数。如下所示:

Price = NetPrice * Amount + profit

命名过的常数的好处是您可以改变在宣告部分的常数值,而不必修改分布在原始码中的叙述。您也可以指定有意义的名称给一个数值,以简化程序的维护。

说明

不注意看的话,您可能会像在使用变量般的使用命名过的常数。但常数的值是无法由程序代码更动。因此,您只能够在指定叙述的右边使用他的名称。

您也可以将数个常数定义在同一行里:

Const VAT = 0.16, Profit = 10

不同于Visual Basic和VBA,VBScript只支持Variant数据型态。命名过的常数在预设情况下会被宣告为public。也就是说在Script开头宣告的常数在整个Script中都是有效的。如果您在程序(Procedure)中宣告了一个常数,那么他的有效范围仅限于该程序里。您可以使用public和Private关键词(将在本章后面介绍)来覆写(Overwrite)这个预设的有效范围。

提示

数值的常数通常是以10为底(十进制数)。然而,您也可以使用十六进制的常数,藉由使用「&Hxxx」的格式(其中xxxx指的是十六进制数值)。举例来说,「&H0C」这个值就等于十进制数的数字12。而文字的常数则必须以双引号围起来(例如"Hello, world")。至于时间和日期的常数则需要用井字号(#)围起来(例如#3/17/1980#)。

内建的常数

VBScript包含了数个预先定义过的常数(也就是所谓的内建常数),例如vbOKOnly。请看下面的叙述:

MsgBox "Hello", 0 + 64, "Test"

如果您使用命名过的常数,则这个叙述会比较具有可读性。

MsgBox "Hello", vbOKOnly + vbInformation, "Test"

如此一来,您唯一必须知道的只有这些内建常数的确切名称而已。

说明

所有的内建常数都条列于〈VBScript程序语言参考〉文件中。

变数(Variables)

变量是指到程序可以储存值的内存位置的代表名称。与常数不同的是,变量在程序执行的期间能够改变其值。您可以直接在程序中使用变量,如下所示:

Price = 45 ' 设定价格

Discount = 17

当变量第一次出现在程序执行时,VBScript会在内存中建立此变量并给定初值。VBScript只对变量提供Variant数据型态。也就是说您能够在变量中储存不同的值,他可以是数字或文字。

Variant的子型态

如同刚才所提过,VBScript只支持Variant数据型态─字符串、日期、布尔(True或False)、整数、浮点数等等。储存在Variant中的值的格式取决于这个值本身。如果您指定一个数字给Variant,那么他就会被储存为数字格式。同理,日期值会被储存为日期格式、文字会被储存为字符串格式等等。储存在Variant中的值的格式称为他的子型态(Variant Subtypes)。

VBScript中大部分的运算都需要使用特定子型态的值,然后传回特定子型态的值。举例来说,若您相加两个拥有数字数据的变量的内容,则得到的结果也会是数字。下面这个叙述会储存数字结果于变量Sum1中:

Sum1 = Price + 15.0

使用「+」运算符,您也可以连接两个字符串:

Message = "字符串1与" + "字符串2"

但是下面这个叙述则会造成一些问题:

Result = "结果:" + Sum1

这个式子的右边包含了字符串和数字变量Sum1。VBScript直译器无法将字符串与数字相加,因而会产生错误讯息(如图4-1所示)。

图4-1 型态不符合所导致的错误讯息

在这种情况下,您可以使用下列的叙述来转换数字子型态:

Result = "结果:" + CStr(Sum1)

VBScript的函数CStr会转换变量Sum1中的数值为字符串格式的Variant数据型态。因此我们便能够连接字符串与数字,并将结果指定给变量result。

说明

使用「+」运算符来连接字符串并非一个好的程序设计训练(虽然我有时候也会这么做)。「+」运算符会相加两个操作数─而当操作数都是字符串时,则做的是「连接」的动作。连接字符串比较好的方法是使用「&」运算符(例如"Hello," & "world")。当使用「&」运算符来合并不同数据格式的值时,VBScript会自动进行数据型态转换,而无须使用CStr。

如果您要定义常数,您也可以把数字视为字符串。您必须使用双引号来围住这个常数。请看下面的叙述:

Text = "15" + "30"

这个叙述不会产生45这个结果。取而代之的是在此叙述执行之后得到一个包含"1530"内容的Text变量。根据前面的解释,比较具有可读性的写法是:

Text = "15" & "30"

这样的叙述会使您想要表达的意思(字符串连接)更为清楚。您可以使用转换函数来把一个子型态转换为另一种Variant子型态。

说明

与Visual Basic和VBA不同的是,VBScript并不允许您预先定义变量的子型态。VBScritp会自动指定子型态。但是您可以利用诸如Asc、CBool、CByte、CCur、CDate、CDbl、Chr、CInt、CLng、CSng、CStr、Hex和Oct之类的转换函数来转换数据型态。您也可以使用VarType函数来查询子型态。关于所有Variant子型态的列表,请参考〈VBScript 用户指南〉文件。

Option Explicit叙述

在预设的情况下,VBScript允许使用没有预先宣告过的变量,也就是变量在被建立和第一次使用时没有先以Dim、Private、Public或ReDim叙述来宣告。但是如果您在自己的Script中允许使用没有预先宣告过的变量,那么您的程序必须担负不可预期的错误的风险。比方说倘若您打错了某个变量的名称,VBScript直译器会以为您使用的是一个不明确的(Implicit)的宣告,并因而建立一个新的变量。让我们假设您在程序代码中输入的是Pris而非price,如下面这个程序片段所示:

VAT = 16.0

Price = 0

Net = 115.00

Pris = Net * (1.0 + VAT/100)

MsgBox Price, vbOKOnly, "价格"

结果并不会如您所想的那样。在指定叙述的打字错误将造成计算后的价格被储存到新的变量Pris中,而非变量price。讯息对话盒显示的结果将是0而非133.4。

要查出笔误的变量名称,您可以在您程序的第一行使用「Option Explicit」叙述。这个叙述会告诉直译器只允许在您的Script中使用以Dim、Private、Public或ReDim叙述明确(Explicit)宣告过的变量。如果您忘记事先宣告您的变量,则WSH会在错误对话盒中回报每一个未经宣告过的变量。WSH的这个功能还可以找出打字错误的变量名称。程序4-2包含了打字失误的变量。

程序4-2 E rrorTest2.vbs

'**************************************************

' 档案: ErrorTest2.vbs (WSH sample in VBScript)

' 作者: (c) G. Born

'

' 使用未宣告过(打字失误)的变量来

' 示范「Explicit statement」叙述

'**************************************************

Option Explicit

' 宣告变量

Dim Message

Dim Title

' 变数初始化

Message = "Hello, world"

Titel = "WSH sample " ' 这个名称没有宣告过!

' 显示讯息

MsgBox Message, vbInformation + vbOKOnly, Title

'*** 程序结束

程序4-2的程序代码中包含了一个打字失误的变量Titel。当直译器遇到这行指定字符串给变量Titel的叙述时,将会跳出错误讯息(如图4-2所示)。

图4-2 指出没有定义变量的错误讯息

注意

如果您在Script中使用「On Error Resume Next」叙述,那么没有定义的变量名称就不会再回报,即使该Script含有「Option Explicit」这个叙述。

.wsf档案中的Option Explicit

如果您使用的是.wsf档案,请确定「Option Explicit」叙述被放在每个

」元素内。否则,就只有包含「Option Explicit」叙述的Script会检查尚未定义的变量。范例程序(WSHDemo2.wsf)示范了这种陷阱:

第一个Script包含了「Option Explicit」叙述。因此,变量name必须被明确地宣告。而第二个Script元素则没有包含这个叙述。所以执行这个Script应该会造成错误,因为变量Text还没有被宣告,但实际上当您执行这个档案时,并没有发生错误,因为「Option Explicit」叙述只有在第一个

两个Script都包含「Option Explicit」叙述,但是变量name是在第一个Script中被宣告的。这个变量的值被使用于第二个Script中。因此,变量name在这个.wsf档案的所有