4. VBScript介绍本章将提供一个对于VBScript(Microsoft Visual Basic的描述语言版本)的简短介绍给那些从来没有用过这种语言或是想要知道VBScript中特定语言结构(例如程序中的条件式If叙述)的使用者。
提示Microsoft提供了〈VBScript程序语言参考〉和〈VBScript用户指南〉这两个有关VBScript详细信息的文件。
随书光盘将他们放在\Docs\VBSDOC55文件夹中,但建议您可以从Microsoft的网站(h ttp:///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 = 10Value1 = Value1 + 10If Value1 > 100 Then Value1 = 100Tax = 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 ExplicitDim 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。