2016-11-25 2 views
0

WQL 검색을 사용하여 VBScript를 사용하여 Windows 검색 유틸리티에 대한 대체 검색 유틸리티를 만들었지 만, 매우 느립니다. 속도를 높이고 싶습니다.하지만 WQL 검색 후 내 검색 필터를 배치해야하고 내 For Each 성명 이전에 검색 필터를 배치해야합니다. 이것은 가능한가?VBScript에서 WMI를 검색 한 후에 "For Each"문 전에 검색 필터를 만들 수 있습니까?

나는 이미 WQL 검색에서 필터링하여 테스트했지만, WQL 검색 후에 필터링하면 약 40 % 더 빠릅니다. 나는 또한 iFlags과 함께 테스트를 해봤지만, MS는 그렇지 않다고 생각 되더라도 검색 속도를 상당히 늦추는 경향이 있습니다.

For Each 문이 다음 스크립트가 검색 필터에게이 파일을 열거 할 때마다 생성 후 필터 인 경우, 사용자는 파일 이름, 작성 날짜, 마지막으로 수정 한 날짜 및/또는 파일 크기별로 검색 할 수 있기 때문에

. 검색에서 약간의 시간을 절약하기 위해 필터를 한 번 만들고 싶습니다.

내가 게시 한 스 니펫을 살펴볼 때 이것은 아마도 더 적합 할 것입니다. 당신은 당신이하고있는 파일의 이름에 의존하기 때문에 (현지 시간 UTC로 변환, 포맷 파일 크기 등 IE)

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 

답변

1

하위 subCreateSearchString 다른 검색 옵션과 기능 통화를 않습니다 반복에서 루프 반복 : 아니, 불가능합니다.

일부 조정을하는 것이 좋습니다. 서브 루틴에서 뭔가를 반환 할 경우

  • Function 오히려 Sub (A)보다를 사용합니다.
  • 전역 변수 사용을 피하십시오. 그들은 원하지 않는 부작용을 초래하는 심한 경향이 있으며 코드를 디버깅하여 뒤에서 고통을줍니다. 매개 변수를 통해 값을 서브 루틴으로 전달하고 실제 반환 값으로 값을 반환하십시오.
  • 반환 값은 정수 (또는 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 
+0

와우 - 당신은 놀라운 지식을 가지고 있습니다! 모든 조언을 주셔서 대단히 감사합니다. 이제 수정해야 할 코드가 너무 많습니다. – user7207540

+0

당신이 말할 수있는대로 (아마도) 나는 초심자가 고급 기술을 사용하려고 시도하는 것보다 조금 더 진보했다. 이것이 내가 배운 방법이다. 내 질문에 관해서는, 아마 그것을 반복하는 각 파일에 검색 문자열을 만들 필요가 없도록 내 코드를 수정하는 방법이 있을까요? 나는 당신에게 (또는 다른 사람들에게) 내가 배울 수있는 방향으로 나를 가리 키기 위해 코드를 작성하라고 요구하지 않는다는 점에 유의하십시오. 다시 한 번 감사드립니다! – user7207540

+0

파일 이름에 문자열이 포함되어 있는지 확인하지 않고 파일 이름에 문자열이 포함되어 있는지 확인할 수 없습니다.스크립트 속도를 높이려면 WMI 쿼리를보다 구체적으로 만들어야하므로 결과가 더 적어집니다. –