3 - 4

3. Flow control in VBScript

条件语句 

VBScript支持以下两种条件控制语句:

  • If…Then…Else 语句

If …Then …Else语句的一个变种是If …Then…如果Then后面的语句可以在一行内书写下的话。注意与C/C++不同的是,你必须用End If 来结束If语句。

If 1 Then
   wscript.echo "it's 1"
   Else
   wscript.echo "it's not 1"
End If

  • Select Case 语句

Select Case 语句的作用类似于C/C++中的switch语句。请看示例:

card = "MasterCard"
 Select Case card
    Case "MasterCard"
  wscript.echo "MasterCard"
    Case "MasterCard"
  wscript.echo "Visa"
    Case "American Express"
  script.echo "American Express"
    Case Else
  sctip.echo "union pay"
End Select

与C/C++不同,case语句支持字符串作为比较的变量,并使用Case Else作为default选项。各Case语句之间不会重复进入,也不需要用break之类的关键字来限制重复进入。

循环语句

在 VBScript 中可使用下列循环语句:

Do…Loop: 当(或直到)条件为 True 时循环。具体语法形式有:

Do While …

Loop

Do Until …

Loop

Do

Loop While …

在这里…应该替换成具体的条件表达式。
While…Wend: 当条件为 True 时循环。语法形式为:

While …

Wend

For…Next: 指定循环次数,使用计数器重复运行语句。 具体语法形式有:

For I = … To … Step …

Next 

在这里,如果不指定步长,则步长为+1,这里,循环变量可以不为整数,步长也可以为负数。
For Each…Next:对于集合中的每项或数组中的每个元素,重复执行一组语句。这个跟C++里的用法差不多。

与C/C++不同的是,循环语句支持跳出,但不支持continue语义。如果一定要实现这种语义,应该寻找变通的办法。跳出是通过Exit来实现的。如果是在For语句中,则为Exit For,在Do循环中为Exit Do。但对While … Wend语句,似乎没有办法可以方便地跳出去。下面是一组例子:

'For .. To with default step length
 Sub DoMyProc50Times()
     Dim x
     For x = 1.05 To 10.05
         wscript.echo "x=" & x
     Next '注意Next后面不跟循环变量。步长默认为1
 End Sub

' For .. To with negative step
  Sub TwosTotal()
     Dim j, total
     For j = 10 To 2 Step -2
         total = total + j
     Next
     wscript.echo "total=" & total
 End Sub

'For each …
 Sub ListFiles(root)
 Set fso = CreateObject("Scripting.FileSystemObject")

Set fldr = fso.GetFolder(root)
 For Each f In fldr.Files
  wscript.echo f.name
  If f.name = "exit.txt" Then Exit For
    Next
 End Sub

 'Do .. Loop
  Sub ChkLastWhile()
     Dim counter, myNum
     counter = 0
     myNum = 9
     Do
         myNum = myNum - 1
         counter = counter + 1
   If counter = 9 Then Exit Do
     Loop While myNum > 10
     MsgBox "循环重复了 " & counter & " 次。"
 End Sub

'While … Wend
 Sub CheckWhile()
 While i < 10
       i = i + 2
    If I = 5 Then Exit Sub 'No exit while or exit wend available  
 Wend
 End Sub

 

4. Procedures in VBScript

为支持代码复用,VBScript提供了过程Sub和函数Function两种语法结构。在C/C++中并没有过程一说,不过VBScript中的过程其实跟函数差别并不大,可以看作是void型的函数。由于两者的差异很小,本文中多数讨论,对两者都适用。

  • 过程Sub

一个过程由

Sub xxx(x,y,..)

End Sub

定义。过程在End Sub处结束,但也可以在中间由Exit Sub退出。

  • 函数Function

一个函数由

Function xxx(x, y,…)

End Function

定义。函数在End Function处结束,但也可以在中间由Exit Function退出。与C/C++不同的是,VBScript没有return语句,函数的返回值由函数名带回去。与VB不同的是,由于VBScript的无类型特性,不可以申明函数返回值的类型,variant声明也是不允许的。关于函数的例子,在第一部分就就给出了一个获取本机IP的例子,读者可以参考那一部分。注意函数的返回值是由

GetIP = IP

带回的。在函数调用时,必须使用括号,否则函数将成为一个过程,并且得不到返回值。

与C/C++灵活的函数用法形成对照的是,VBScript中的过程和函数的用法很弱。为许多VBScript的爱好者诟病的不足之一是,VBScript的函数和过程不支持可变参数。尤其令人气愤的是,在VBScript中存在大量系统函数调用是允许可变参数的。这种不一致性给编程人员带来额外的理解和记忆上的麻烦。好在失望之余,还存在一些不太直观的补救方法。其一是可以仅为函数指定一个形式参数,且将这个参数定义为数组。由于VBScript的无类型特性,因此数组的各个元素可以携带不同类型的数据(指子类型)。请看示例:

首先要定义两个辅助函数IsMissing和Valid。IsMissing是VB中支持的函数,但在VBScript中,我们需要自已来定义。

Function Valid(arrayVar,arrayIndex)
    If ubound(arrayVar)<arrayIndex or lbound(arrayVar)>arrayIndex Then
         Valid=Empty
     Else
         Valid=arrayVar(arrayIndex)
     End If
End Function

Function IsMissing(var)
    IsMissing=((vartype(var) mod 8192 mod 10)=0)
End Function

这里,如果vartype(var) mod 8192(vbArray)不为vbError的话,则再对10(vbError)求模必不为0,因此var为无效参数,因为我们要求这里var定义为一维数组。

接下来,我们需要定义可变参数的函数:

Function myfuncVBS(arrVar) 
    Dim var1, var2
    var1=Valid(arrVar,0)
    var2=Valid(arrVar,1)
    If IsMissing(var1) then
        myfuncVBS="You have no pets."
    ElseIf IsMissing(var2) then
        myfuncVBS="Your dog has " & var1 & " puppies."
    Else
        myfuncVBS="Your dog has " & var1 & " puppies and your cat has " & var2 & " kittens."
    End If
End Function

我们的自定义函数最多允许两个参数,但只声明一个数组参数(实际上只能从调用形式上才能看出来,记住,在VBScript中,数据的实际取值决定数据的类型。现在结合这个函数看,IsMissing和Valid辅助函数的语义就很直观了。在Valid函数调用下面的If … Else语句用来给缺省参数赋默认值。这些在C++中不用程序自己照料的事情,在这里必须得自己做了。

最后是如何调用这个允许变参的函数,答案是使用Array()函数。 

wscript.echo myfuncVBS(Array(,1))   'Option 1
wscript.echo myfuncVBS(Array(1))    'Option 2

上面的代码中,如果不使用缺省参数,完整的调用形式应该为

Dim Value1
Dim Value2
wscript.echo myfuncVBS(Array(value1,value2))   'No option

VBScript也没有名字空间的概念。似乎惟一的办法是将函数定义在类中,这样调用某个函数就转化为调用某个类的方法,而且必须使用对象做为前缀,可惜没有static关键字,所以调用之前仍然必须先构造对象。记得public和private关键字在声明函数和过程时可用。

Class MyNameSpaces_
    Sub MyFunc()
         wscript.echo "hello world!"
    End Sub
End Class

Set MyNameSpaces = new MyNameSpaces_
MyNameSpaces.MyFunc
Set f = Nothing

好了,在讨论关于可变参数函数和名字空间的workaround之后,关于VBScript函数和过程讨论的也可以暂时告一段落了。当然,关于函数和过程名字的可见性仍然是一个很重要的话题,我将会在多文件工程中再次讨论它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值