WQL (基本的に SQL for WMI) は、TOP または LIMIT キーワードをサポートしていません。Sql Server は TOP を使用し、他の多くの RDBMS は LIMIT などをサポートしています。
結果セットを任意の数に制限する TOP/LIMIT 句があるかのように動作するように SELECT クエリをエミュレートする回避策はありますか?
それとも、TOP や LIMIT のように機能する WQL 固有のキーワードは他にありますか?
いいえ、WQL だけを使用して TOP をシミュレートする方法はありません。
例外: 幸運にも、キーとして使用されている昇順の数値インスタンス番号を使用している WMI クラスを照会することができた場合は、大なり比較と小なり比較を使用して、結果を制限し、ページングすることができます。
WQL クエリを使用する代わりにManagementClass.GetInstances()を使用すると、十分なインスタンスを収集した後で途中で列挙をキャンセルできる可能性があります。これにより、リスト全体を一度に列挙する CPU と RAM のコストを支払う必要がなくなります。
知る限り、CIMV2 WMI プロバイダーは WQL をネイティブに処理しないことに注意してください。代わりに、WMI に依存してすべてのインスタンスを列挙し、WQL を処理し、呼び出し元に返す前に結果をフィルター処理します。ただし、コストのかかる部分 (実際に基になる WMI データを取得すること) はまだ完了しています。したがって、(ローカル WMI クエリの場合) WQL を使用するのではなく、GetInstances() を使用して結果を自分でフィルター処理しても、効率が向上することはないと思います。GetInstances() で途中でキャンセルできる場合は、GetInstances()長い結果セットの場合、はるかに安くなる可能性があります。
ジャスティンが言ったように。ただし、正確な要件についてはわかりません。Visual Basicを使用して単純なプロジェクトを実行していましたが、その一部はイベントログをフェッチすることでしたが、アプリケーションログのサイズが大きい(> 20MB)ためにリストビューが失敗し、コントロールが何らかの無限ループに入ります。制限したかったので、ここに擬似コードがあります
topval = UserInputText.Text 'Assuming user entered the top 10 or 20
while ThereAreStillItemsInCollection
if topval = 0 then
goto CleanUpMemObjectsAndReturn
end if
topval = topval - 1
wend
CleanUpMemObjectsAndReturn:
set obj = Nothing
end sub
「selectxyz-First1」でパイプします
例:Get-WmiObject win32_logicaldisk | select -First 1