循环语句
使用循环语句可以反复执行某段脚本,直到满足循环结束条件后才停止。如表3.2所示,在VBScript中,提供了四种循环语句:For…Next语句、Do…Loop语句、While…Wend语句和For Each…Next语句。在这四种循环语句中,For Each…Next语句是比较特殊的一种,它不是指定循环的次数、也没有指定循环的结束条件,而是提供了枚举集合中元素的一种方法。运用循环语句,可以极大地方便我们开发脚本的工作。
表3.2 VBScript语句中的循环语句
Next 对每个集合对象中的项目或数组中的元素重复执行一次循环。
3.1.2.1 For…Next语句
For…Next语句在循环的过程中,可以指定循环运行的次数,当到达循环运行次数之后,退出循环。其语法如下所示:
For counter = start To end Step stepsize
statements
Next
其中,counter是用作循环计数器的数值变量,start是循环变量的初值,end是循环变量的终值,stepsize是循环变量的步长,在默认条件下stepsize=1,statements是循环内反复执行的脚本。
在执行For…Next语句有以下几个步骤:
1. 将初值赋给循环变量,即执行counter=start;
2. 判断循环条件,如果循环步长大于等于0,则循环条件是counter<=end,如果循环步长小于0,则循环条件是counter>=end,如果循环条件为True,则执行循环中的语句,如果循环条件为False,则跳出循环;
3. 执行循环代码,再将步长累加到循环计数器上,即执行counter=counter+stepsize,然后返回步骤2判断循环条件。
举个例子。下面的程序会计算从1到50所有数值相乘的结果。这个For语句指定了一个计数器I,同时指定了该计数器的起始值和结束值。Next语句会使计数器的值在每次循环执行时自动递增1。使用Visual Basic的编程人员注意,在VB语句中的For语句在Next语句之后必须跟有作为计数器的变量,而在VBScript语句中,该变量不必再写了。
Dim I, nResult
nResult = 1
For I = 1 To 50
nResult = nResult * I
Next
MsgBox “结果为:” & nResult
使用Step关键字,用户就可以随自己的需要来递增或是递减计数器变量。在下面的例子中,计数器变量j会在每次循环执行后递增2。当循环执行完时,变量nResult將是2、4、6、8和10的总和。
Dim j, nResult
nResult = 0
For j = 2 To 10 Step 2
total = total + j
Next
MsgBox “结果为:” & nResult
如果用户要使计数器变量递减时,则可以使用负的Step值。此时,结束值必须小于起始值。在下面例子中,计数器变量myNum会在每次循环执行过后
递减2。当这个循环结束时,变量total的值将会是16、14、12、10、8、6、4和2的总和。
Dim nStep nResult
nResult = 0
For nStep = 16 To 2 Step -2
nResult = nResult + nStep
Next
MsgBox “结果为:” & nResult
用户可以使用Exit For语句在计数器到达其结束值之前跳离Next语句。因为通常用户只会希望在某些特定的情形发生时,才要跳离循环,比如像发生了错误时。所以用户应该把Exit Do语句放在If...Else语句的Then子句之后的语句中。当条件是False时,循环就会照常执行。
需要指出的是,VBScript和Visual Basic的Next语句在使用上有所不同,Visual Basic中,Next语句后一般要求一个循环变量,但在VBScript中,Next语句后不要求循环变量,如果后面有循环变量,反而会导致错误的出现。
一般情况下,我们不建议在循环执行的过程中,使用语句改变循环计数器的值,因为这样会使得脚本的可读性变差,代码的调试和维护工作都会变得困难得多。
在循环中,我们还可以使用循环嵌套,不过循环嵌套的过程中,要求各重循环计数器的变量不同,例如:
For I = 1 To 10
For J = 1 To 10
……
Next
Next
3.1.2.2 Do…Loop语句
Do…Loop语句和For…Next语句有所不同,For…Next语句中,循环执行的次数是确定的,而Do…Loop中,循环执行的次数则往往是不确定的,如果循环条件为True或者循环条件变为True,循环将会一直执行。
Do…Loop语句有两种形式:Do While/Until…Loop和Do…Loop While/Until。
我们先来看第一种形式。Do While/Until…Loop的语法如下所示:
Do { While|Until} condition
statements
Loop
其中,condition是循环执行条件,statements是循环内反复执行的脚本。
Do While/Until…Loop循环的执行步骤如下所示:
while语句简单例子1. 如果是Do While…Loop循环,则判断condition是否满足,如果满足,则进入步骤2执行循环内脚本,否则跳出循环;如果是Do Until…Loop循环,则判断condition是否不满足,如果不满足,则进入步骤2执行循环内脚本,如果满足condition,则跳出循环;
2. 执行循环中脚本,然后返回步骤1。
在Do...Loop语句中,需用While关键字来检查条件。用户可以在进入循环之前就先检查条件,或在循环至少执行过一次之后再检查,比如下面的ChkLastWhile例子。在ChkFirstWhile程序中,如果myNu
m不是设成20,而是设成9,那么在循环中的语句就永远不会被执行。在ChkLastWhile程序中,循环里的语句只会被执行一次。因为它的条件已经是False了。
Sub ChkFirstWhile()
Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do
my
Num = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
而如果我们将上述脚本中的While改为Until,再执行这段脚本,我们则会发现执行结果不一样了。这是由于Do Until…Loop中,在执行循环内代码前先判断循环条件是否不满足,只有在不满足的情况下,Do Until…Loop才会执行循环内脚本,而如果满足,则循环内代码一次也不会执行。
在Do...Loop语句中,用户有两种方法来使用Until关键字检查条件。用户可以在进入循环前先检查条件,或在循环至少执行过一次后再检查(如下面的ChkLastUntil例子)。只要在条件是False时,循环就会执行。
Sub ChkFirstUntil( )
Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitons."
End Sub
Sub ChkLastUntil()
Dim counter, myNum
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
我们再来看第二种形式。Do…Loop While/Until的语法如下所示:
Do
statements
Loop { While|Until} condition
其中,condition是循环执行条件,statements是循环内反复执行的脚本。
Do…Loop While/Until循环的执行步骤如下所示:
1. 执行循环中脚本;
2. 对于Do…Loop While循环,则判断condition是否满足,如果满足,返回步骤1执行循环内脚本,否则跳出循环;如果是Do…Loop Until循环,则判断condition是否不满足,如果不满足,则返回步骤1执行循环内脚本,如果满足condition,则跳出循环。
如果我们将上述脚本中的While改为Until,再执行这些脚本,我们就会发现结果和Do Until…Loop的结果有所不同。这是由于在Do…Loop Until循环中,首先将执行一次循环内脚本,然后再对循环条件进行判断,这也就是说,不论循环条件如何设定,Do…Loop While/Until循环都将至少执行一次循环内的脚本。
注意,在Do…Loop循环中一定要有改变循环条件中变量的语句,否则,很有可能会陷入死循环而不能终止。就技术上来说,用户可以在Do...Loop中使用Exit Do语句来跳离循环。因为通常用户只会希望在某些特定的情形发生时,才需要跳离循环语句,比如像要避免死循环时,用户应该把Exit Do语句放在If...Else语句的Then之后的语句块中。当条件是False时,循环就会照常执行,而当条件为True时,即满足离开循环的条件时,将执行Exit Do语句。
在下面的例子中,myNum将会被指定成一个会造成无限循环的值。其中的If...Else语句将会检查这个条件,以避免无限死循环的发生。
Sub ExitExample()
Dim counter, myNum
counter = 0
myNum = 9
Do Until myNum = 10
myNum
= myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
3.1.2.3 While…Wend语句
While…Wend语句和Do…Loop语句十分类似,但不如Do…Loop语句那样灵活,在While…Wend语句中,如果条件为True,则执行循环内脚本。其语法如下所示:
While condition
statements
Wend
其中,conditin是循环执行条件,statements是循环内执行的脚本。
While…Wend语句的执行步骤如下所示:
1. 判断condition是否为True,如果为True,则进入步骤2执行循环内脚本,如果为False或者为Null,则跳出循环;
2. 执行循环中脚本,然后返回步骤1。
与Do … Loop语句不同的是,While循环语句没有任何可以跳离循环的语句,用户不能想当然地使用Exit While语句。
不过,和Do…Loop语句比较而言,While…Wend语句的灵活性要差一些,脚本的清晰程度则是相同的,所以我们建议,在同样的情况下,还是使用Do…Loop语句。
3.1.2.4 For Each…Next语句
For Each…Next语句和上述三个循环语句都有所不同,它既不指定循环执行的次数,也不指定循环结束条件,而是对数组和集合中的元素进行枚举,当枚举结束之后才会退出循环。其语法如下所示:
For Each element In group
statements
Next
其中,group是我们进行枚举的数组或者集合,element是枚举变量的名称,statements是对于每个元素都会执行的循环脚本。
Next和Next循环非常相似。它们的不同之处在于,Next循环是针对集合对象中的每一个对象或数组中的每一个元素重复执行一次循环,而Next循环语句是依指定的数字重复执行循环的次数。当用户不知道集合对象中有几个元素时,Next循环语句将会特別的有用。
在下面的HTML程序范例中,Dictionary对象的功能是要将文字放到数个文本框中:
01.<HTML>
02.<HEAD>
03.<TITLE>简单例子</TITLE>
04.</HEAD>
05.<SCRIPT LANGUAGE="VBScript">
06.<!--
07.Sub btnFill_OnClick
08.Dim d ‘定义一个对象变量
09.Set d = CreateObject("Scripting.Dictionary") ‘建立一个Dictionary对象
10.d.Add "0", "Sanders" ‘将有关信息放入该对象之中
11.d.Add "1", "Shirley"
12.d.Add "2", "Winfred"
13.
14.For Each I in d
15.Document.Form.Elements(I).Value = D.Item(I)
16.‘将文字放入文本框之中
17.Next
18.End Sub
19.-->
20.</SCRIPT>
21.<BODY>
22.<CENTER>
23.<FORM NAME="Form"
24.
25.<Input Type = "Text"><p>
26.<Input Type = "Text"><p>
27.<Input Type = "Text"><p>
28.<Input Type = "Text"><p>
29.<Input Type = "Button" NAME=btnFill VALUE="填入信息"><p>
30.</FORM>
31.</CENTER>
32.</BODY>
33.</HTML>
复制代码
3.1.2.5 Exit语句
在结构化程序设计的过程中,Goto语句的取消
可以极大地增强程序的可读性,便于程序的阅读与维护,不过,也不可避免带来了一些不足之处。在某些循环嵌套的程序中,在合适的地方使用Goto语句能够使程序显得简洁明了,并且代码效率高,在禁止使用Goto语句的场合中,虽然不使用Goto语句也完全能够实现同样的功能,但是却使得程序的可读性和代码效率形成了一种矛盾,要么追求代码的高效率而使得程序晦涩难懂,要么追求程序结构清晰而降低了代码的效率。所以在C语言中提供了break、continue、Exit等半结构化语句,这些语句能够实现一定的跳转功能,保持代码的高效,也能够使得程序保持较强的可读性。
在VBScript中也提供了类似的语句,使用Exit语句能够停止程序当前正在执行的逻辑,退出循环或者当前过程。它能够退出Do…Loop、For…Next循环,也能够退出Function和Sub的过程处理,关于Function定义的函数和Sub定义的过程,我们会在下一节中介绍。
Exit语句有以下四种语法形式:
1. Exit Do:提供了一种退出Do…Loop循环的方法,Exit Do只能在Do…Loop语句中使用,执行Exit D
o语句之后将控制权转移到Loop语句之后。
2. Exit For:提供了一种退出For循环的方法,Exit For语句只能在For…Next语句或者For Each…Next循环中使用,执行Exit For语句之后将控制权转移到Next语句之后。
3. Exit Function:执行Exit Function语句之后退出当前函数。
4. Exit Sub:执行Exit Sub语句之后退出当前过程。
例如,我们可以使用Exit Do语句实现一个死循环中的退出,在下面的脚本中,当循环计数器大于10之后,退出循环处理,而循环本身并不具备结束循环的功能:
counter = 0
Do While True
counter = counter + 1
If counter > 10 Then Exit Do
Loop
当然上面的脚本完全不需要使用Exit Do语句,但是在许多场合中,使用Exit语句之后能够显著提高脚本的执行效率。
图及循环查多个相同图片,源码===========================
01. //一般图
02.FindPic 0,0,1024,768,"Attachment:\图片名.bmp",0.9,intX,intY
03.If intX > 0 And intY > 0 Then
04.    MoveTo intX, intY
05.    Delay 100
06.    LeftClick 1
07.    Delay 1000
08.End If
09.
10.//到图为止========================================
11.i=0
12.While i = 0
13.    FindPic 0,0,1024,768,"Attachment:\图片名.bmp",0.9,intX,intY
14.    If intX > 0 And intY > 0 Then
15.        i=1
16.        MoveTo intX, intY
17.        Delay 100
18.        LeftClick 1
19.        Delay 1000
20.    End If
21.Wend
22.
23.//查有多个相同的图,直到图不到为止======================================
24.Do
25.    FindPic 0,0,1024,768,"Attachment:\图片名.bmp",0.9,intX,intY
26.    If int

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。