论文部分内容阅读
上期讲到:VBS脚本中,方法(method)也是构成语句(sentence)的重要部分。方法必须引用一个明确的对象(object)/集合(collection),使用句点(.)表示对对象的引用。方法做为让外界访问对象的工具。目前VBS脚本中有46个方法。下面介绍Do...Loop和While...Wend语句和用法。
一、使用通配符搜索指定文件夹的文件并将结果输出到文件
本期在上期的基础上扩展支持“?*”通配符的文件搜索。脚本范例只给出支持“?*”通配符的文件搜索算法部分的代码,读者可结合上期范例自行修改替换代码。遵循微软Windows“搜索”使用通配符的约定。
Sub SearchTheName(objFolder)
If arrOptions(Folder_Name) = 1 Then
For Each objSubFolder In objFolder.SubFolders
strName = objSubFolder.Name
If 0 <> FindInName(strName, strFindKeyWord) Then
strFoundFile = strFoundFile & objSubFolder.Path & vbCrLf
End If
Next
End If
For Each objFile In objFolder.Files
If 0 = InStrRev(strFindKeyWord, ".") Then
strName = objFso.GetBaseName(objFile.Path)
Else strName = objFile.Name
End If
If 0 <> FindInName(strName, strFindKeyWord) Then
strFoundFile = strFoundFile & objFile.Path & vbCrLf
End If
Next
If arrOptions(Sub_Folder) <> 1 Then Exit Sub
For Each objSubfolder In objFolder.SubFolders
SearchTheName objSubfolder
Next
End Sub
Function FindInName(strName, strFindWord)
If 0 = InStr(strFindWord, "?") And 0 = InStr(strFindWord, "*") Then
FindInName = InStr(1, strName, strFindWord, _
arrOptions(Match_Case) Xor 1)
Exit Function
Else
arrFindWord = Split(strFindWord, "*")
intCount = 1
For I = 0 To UBound(arrFindWord)
If I = 0 Then
For J = 1 To Len(arrFindWord(I))
If Mid(arrFindWord(I), J, 1) <> "?" Then
If (arrOptions(Match_Case)=0 And _
UCase(Mid(arrFindWord(I), J, 1)) <> UCase(Mid(strName, J, 1))) Or _
(arrOptions(Match_Case)=1 And _
Mid(arrFindWord(I), J, 1) <> Mid(strName, J, 1)) Then
FindInName = 0 : Exit Function
Else intCount = intCount + 1
End If
Else intCount = intCount + 1
End If
Next
Else
For J = 1 To Len(arrFindWord(I))
If Mid(arrFindWord(I), J, 1) <> "?" Then
intPos = InStr(intCount, strName, Mid(arrFindWord(I), J, 1), _
arrOptions(Match_Case) Xor 1)
If J = 1 Then intCount = intPos
If intPos = 0 Then
FindInName = 0 : Exit Function
ElseIf intPos = intCount Then
intCount = intCount + 1
Else FindInName = 0 : Exit Function
End If
Else
If intCount > Len(strName) Then
FindInName = 0 : Exit Function
Else intCount = intCount + 1
End If
End If
Next
End If
Next
End If
FindInName = 1
End Function
二、通透理解Do...Loop和While...Wend循环语句
1.Do...Loop语句的用法
Do...Loop语句有前条件与后条件两种语法:
Do [{While} 条件] 或者:
[语句] Do
[Exit Do] [语句]
[语句][Exit Do]
Loop [语句]
Loop [{Until} 条件]
前条件语法在启动循环之前必须先测试条件,当条件为真时或条件变为真之前启动循环执行一系列语句,而后条件语法则无条件启动循环,执行一系列语句,其中经常遇到由If...Then语句判断结果为真值执行Exit Do语句即退出循环。当执行到Loop时返回测试条件开始下一次循环,一直到条件为假(False)或条件变为真时结束执行循环。前条件语法多用于防止非法操作,像逐行读取文本文件或者逐个字符读取文本文件中一行文本,可防止指针超越文件结束或行末。后条件语法多用于某种重复计算达到一个设定的条件值时结束。While与Until的区别在于前者条件为真时执行循环,后者在条件变为真之前(即假)时执行循环,二者只能取一,没有什么特殊的区别。同样,Do...Loop循环语句可以多重嵌套循环。
2.While...Wend语句的用法
While 条件
[语句]
Wend
如果条件为真,则执行循环内所有语句,然后重新测试条件。如果条件仍为真,则重复执行循环,直到条件不为真时结束执行循环。值得注意使用While...Wend语句如果条件设置不当可能造成死循环。同样,While...Wend循环语句可以多重嵌套循环。
3.下期预告:介绍Select Case语句和用法。
一、使用通配符搜索指定文件夹的文件并将结果输出到文件
本期在上期的基础上扩展支持“?*”通配符的文件搜索。脚本范例只给出支持“?*”通配符的文件搜索算法部分的代码,读者可结合上期范例自行修改替换代码。遵循微软Windows“搜索”使用通配符的约定。
Sub SearchTheName(objFolder)
If arrOptions(Folder_Name) = 1 Then
For Each objSubFolder In objFolder.SubFolders
strName = objSubFolder.Name
If 0 <> FindInName(strName, strFindKeyWord) Then
strFoundFile = strFoundFile & objSubFolder.Path & vbCrLf
End If
Next
End If
For Each objFile In objFolder.Files
If 0 = InStrRev(strFindKeyWord, ".") Then
strName = objFso.GetBaseName(objFile.Path)
Else strName = objFile.Name
End If
If 0 <> FindInName(strName, strFindKeyWord) Then
strFoundFile = strFoundFile & objFile.Path & vbCrLf
End If
Next
If arrOptions(Sub_Folder) <> 1 Then Exit Sub
For Each objSubfolder In objFolder.SubFolders
SearchTheName objSubfolder
Next
End Sub
Function FindInName(strName, strFindWord)
If 0 = InStr(strFindWord, "?") And 0 = InStr(strFindWord, "*") Then
FindInName = InStr(1, strName, strFindWord, _
arrOptions(Match_Case) Xor 1)
Exit Function
Else
arrFindWord = Split(strFindWord, "*")
intCount = 1
For I = 0 To UBound(arrFindWord)
If I = 0 Then
For J = 1 To Len(arrFindWord(I))
If Mid(arrFindWord(I), J, 1) <> "?" Then
If (arrOptions(Match_Case)=0 And _
UCase(Mid(arrFindWord(I), J, 1)) <> UCase(Mid(strName, J, 1))) Or _
(arrOptions(Match_Case)=1 And _
Mid(arrFindWord(I), J, 1) <> Mid(strName, J, 1)) Then
FindInName = 0 : Exit Function
Else intCount = intCount + 1
End If
Else intCount = intCount + 1
End If
Next
Else
For J = 1 To Len(arrFindWord(I))
If Mid(arrFindWord(I), J, 1) <> "?" Then
intPos = InStr(intCount, strName, Mid(arrFindWord(I), J, 1), _
arrOptions(Match_Case) Xor 1)
If J = 1 Then intCount = intPos
If intPos = 0 Then
FindInName = 0 : Exit Function
ElseIf intPos = intCount Then
intCount = intCount + 1
Else FindInName = 0 : Exit Function
End If
Else
If intCount > Len(strName) Then
FindInName = 0 : Exit Function
Else intCount = intCount + 1
End If
End If
Next
End If
Next
End If
FindInName = 1
End Function
二、通透理解Do...Loop和While...Wend循环语句
1.Do...Loop语句的用法
Do...Loop语句有前条件与后条件两种语法:
Do [{While} 条件] 或者:
[语句] Do
[Exit Do] [语句]
[语句][Exit Do]
Loop [语句]
Loop [{Until} 条件]
前条件语法在启动循环之前必须先测试条件,当条件为真时或条件变为真之前启动循环执行一系列语句,而后条件语法则无条件启动循环,执行一系列语句,其中经常遇到由If...Then语句判断结果为真值执行Exit Do语句即退出循环。当执行到Loop时返回测试条件开始下一次循环,一直到条件为假(False)或条件变为真时结束执行循环。前条件语法多用于防止非法操作,像逐行读取文本文件或者逐个字符读取文本文件中一行文本,可防止指针超越文件结束或行末。后条件语法多用于某种重复计算达到一个设定的条件值时结束。While与Until的区别在于前者条件为真时执行循环,后者在条件变为真之前(即假)时执行循环,二者只能取一,没有什么特殊的区别。同样,Do...Loop循环语句可以多重嵌套循环。
2.While...Wend语句的用法
While 条件
[语句]
Wend
如果条件为真,则执行循环内所有语句,然后重新测试条件。如果条件仍为真,则重复执行循环,直到条件不为真时结束执行循环。值得注意使用While...Wend语句如果条件设置不当可能造成死循环。同样,While...Wend循环语句可以多重嵌套循环。
3.下期预告:介绍Select Case语句和用法。