user7207540
user7207540

Reputation: 75

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

I've created an alternative search utility to the Windows search utility with VBScript using a WQL search, but, as it turns out, it's quite slow. I would like to speed it up and I think I can do it, but I would need to place my search filter AFTER my WQL search and BEFORE my For Each statement. Is this even possible?

I've already tested by filtering in the WQL search, but it's about 40% faster if I filter after the WQL search. I've also tested with and without iFlags, but they tend to slow the search quite a bit, even though MS seems to believe otherwise.

Since the user can search by filename, creation date, last modified date and/or file size, if the filter is after the For Each statement then the script has to create the search filter each time it enumerates a file. I'd like to create the filter once in the hope of shaving some time off the search.

This will probably make better sense when you take a look at the snippet of code I've posted. Note that the sub subCreateSearchString will have calls to other search options and functions (ie: convert from UTC to local time, format file sizes, etc.)

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

Upvotes: 0

Views: 124

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200233

Since you depend on the names of the files you're iterating over in the For Each loop: no, not possible.

I'd strongly recommend making some adjustments, though.

  • Use a Function rather than a Sub if you want to return something from a subroutine.
  • Avoid using global variables. They have a nasty tendency of introducing undesired side effects and also make debugging your code a pain in the rear. Pass values into your subroutines via parameters, and return values as actual return values.
  • The returned value is an integer (or Null), but you use it like a boolean and named your variables (and sub) as if it were a string. Don't do that. Name your functions/procedures after what they're doing, and name your variables after what they contain. And if you want to use a boolean value make your function actually return a boolean value.
  • Avoid Hungarian Notation. It's pointless code-bloat the way most people use it. Even more if your naming doesn't even match the actual type.
  • Do not use global On Error Resume Next. Ever. It simply makes your code fail silently without telling you anything about what actually went wrong. Keep error handling as local as possible. Enable it only for single commands or short code blocks, and only if there is no other way to avoid/handle the error.
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

Upvotes: 1

Related Questions