【问题标题】:After a WMI search in VBScript, can I create my search filter BEFORE my "For Each" statement?在 VBScript 中进行 WMI 搜索后,我可以在“For Each”语句之前创建搜索过滤器吗?
【发布时间】:2016-11-25 02:21:26
【问题描述】:

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

我已经通过 WQL 搜索中的过滤进行了测试,但是如果我在 WQL 搜索之后进行过滤,速度会快 40%。我还测试了有无 iFlags,但它们往往会减慢搜索速度,尽管 MS 似乎不这么认为。

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

当您查看我发布的代码的 sn-p 时,这可能会更有意义。请注意,子 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

【问题讨论】:

    标签: search vbscript wmi-query


    【解决方案1】:

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

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

    • 如果您想从子例程返回某些内容,请使用 Function 而不是 Sub
    • 避免使用全局变量。它们有一种令人讨厌的趋势,即引入了不希望的副作用,并且还使调试代码在后面变得很痛苦。通过参数将值传递到您的子例程中,并将值作为实际返回值返回。
    • 返回值是一个整数(或Null),但您可以像使用布尔值一样使用它,并将变量(和子)命名为字符串。不要那样做。以他们正在做的事情命名你的函数/过程,并以它们包含的内容命名你的变量。如果您想使用布尔值,请让您的函数实际返回一个布尔值。
    • 避免Hungarian Notation。大多数人使用它的方式是毫无意义的代码膨胀。如果您的命名与实际类型不符,则更是如此。
    • 不要使用全局On Error Resume Next。曾经。它只是让您的代码默默地失败,而不会告诉您实际出了什么问题。尽可能保持本地错误处理。仅对单个命令或短代码块启用它,并且仅在没有其他方法可以避免/处理错误时启用。
    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
    

    【讨论】:

    • 哇 - 你是一个惊人的知识财富!非常感谢所有的建议。我现在有很多代码要修改。
    • 如您所知(很可能),我比尝试使用高级技术的新手稍微先进一点……这就是我学习的方式。关于我的问题,有没有办法修改我的代码,以便它不必在它迭代的每个文件上创建搜索字符串?请注意,我并不是要您(或其他任何人)为我编写代码,只是为了指出我可以学习的方向?再次感谢!
    • 如果不检查文件名是否包含字符串,则无法检查文件名是否包含字符串。为了加快您的脚本,您可能需要使您的 WMI 查询更具体,以便它返回更少的结果。
    • 我明白你在告诉我什么,但是有没有办法在我的“subCreateSearchString”期间设置变量,而不是它的返回值(这将按照你的建议更改为函数)。 RE:使 WMI 查询更具体,我已经对其进行了测试,而且我做得越具体,迭代文件所需的时间就越长。我知道这似乎违反直觉,但证据就在布丁中。
    • 但是有没有办法在我的“subCreateSearchString”期间设置变量,而不是它的返回值之前“no”的哪一部分不够清楚?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-11-22
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多