在 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
我已经使用 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