用通配符搜索指定文件夹中的文件

时间:2022-10-16 03:56:30

用通配符搜索指定文件夹中的文件

上期讲到: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语句和用法。

上一篇:用“”搭出沟通网络的桥梁 下一篇:亲手捏死潜行木马