在 VBScript 中进行 WMI 搜索后,我可以在我的 "For Each" 语句之前创建我的搜索过滤器吗?

After a WMI search in VBScript, can I create my search filter BEFORE my "For Each" statement?

我已经使用 WQL 搜索通过 VBScript 创建了 Windows 搜索实用程序的替代搜索实用程序,但事实证明,它非常慢。我想加快它的速度,我想我可以做到,但我需要在我的 WQL 搜索之后和我的 For Each 语句之前放置我的搜索过滤器。这可能吗?

我已经通过在 WQL 搜索中进行过滤进行了测试,但如果我在 WQL 搜索之后进行过滤,速度会提高大约 40%。我还测试了使用和不使用 iFlags,但它们往往会大大减慢搜索速度,即使 MS 似乎不这么认为。

由于用户可以按文件名、创建日期、最后修改日期 and/or 文件大小进行搜索,如果过滤器位于 For Each 语句之后,则脚本每次都必须创建搜索过滤器它枚举一个文件。我想创建一次过滤器,希望能节省一些搜索时间。

当您查看我发布的代码片段时,这可能会更有意义。请注意,sub subCreateSearchString 将调用其他搜索选项和函数(即:从 UTC 转换为本地时间、格式化文件大小等)

Dim strSearchName, strComputer, objSWbemServices, objFile, colFiles
Dim strFileName, strReturnedFileName, strQueryDriveAndPath

strSearchName = "test" 'Text being searched for - change as needed
strQueryDriveAndPath = "PATH = '\Drop_RW\' AND DRIVE = 'D:'" 'Path and drive in which to search - change as needed

strComputer = "."
Set objSWbemServices = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2")
Set colFiles = objSWbemServices.ExecQuery("Select * from CIM_DataFile WHERE " & "" & strQueryDriveAndPath & "")

'* I'd like to place the call to "subCreateSearchString" here

On Error Resume Next

For Each objFile in colFiles
    strReturnedFileName = objFile.Name
    subCreateSearchString ' Search filter - it works when placed here
    If strSearchForString Then
        MsgBox "File matches:" & vbCrLf & strReturnedFileName
    Else
        MsgBox "File DOES NOT match"  & vbCrLf & strReturnedFileName
    End If
Next

Sub subCreateSearchString
    '* Set Filename Variable for search:
    strFileName = InStr(LCase(strReturnedFileName), LCase(strSearchName))
    strSearchForString = strFileName
End Sub

由于您依赖于在 For Each 循环中迭代的文件的名称:不,不可能。

不过,我强烈建议您进行一些调整。

  • 如果你想 return 来自子程序的东西,请使用 Function 而不是 Sub
  • 避免使用全局变量。它们有引入不良副作用的令人讨厌的趋势,并且还会使调试代码变得很痛苦。通过参数将值传递给您的子例程,并将 return 值作为实际 return 值。
  • returned 值是一个整数(或 Null),但您可以像布尔值一样使用它,并将您的变量(和子变量)命名为字符串。不要那样做。在他们正在做的事情之后命名你的 functions/procedures,并在他们包含的内容之后命名你的变量。如果你想使用一个布尔值,让你的函数实际上 return 一个布尔值。
  • 避免Hungarian Notation。大多数人使用它的方式是毫无意义的代码膨胀。如果您的命名甚至与实际类型不匹配,甚至更多。
  • 不要使用全局 On Error Resume Next。曾经。它只是让你的代码悄无声息地失败,而不告诉你任何关于实际出错的地方。尽可能在本地处理错误。仅为单个命令或短代码块启用它,并且只有在没有其他方法 avoid/handle 错误时才启用它。
Function IsInFilename(searchName, fileName)
    IsInFilename = InStr(LCase(fileName), LCase(searchName)) > 0
End Function

For Each objFile in colFiles
    If IsInFilename(strSearchName, objFile.Name) Then
        MsgBox "..."
    Else
        MsgBox "..."
    End If
Next