2016-11-25 8 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は、他の検索オプションや関数の呼び出しを持っていることに注意してください反復で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 
+0

ワウ - あなたは非常に豊富な知識です!すべてのアドバイスをありがとう。私は今、改訂すべきコードをたくさん持っています。 – user7207540

+0

あなたが言うことができるように(ほとんどの場合)、私は先進的なテクニックを使用しようとしている初心者より少し上級です...これは私が学ぶ方法です。私の質問に関しては、おそらく、それはそれが繰り返す各ファイルに検索文字列を作成する必要がないように私のコードを変更する方法はありますか?私はあなたに(または他の誰かに)私のコードを書くよう求めていないことに注意してください。再度、感謝します! – user7207540

+0

ファイル名に文字列が含まれているかどうかをチェックせずに、ファイル名に文字列が含まれているかどうかを確認することはできません。スクリプトをスピードアップするには、おそらくWMIクエリをより具体的にする必要があります。その結果、結果が少なくなります。 –

関連する問題