2017-09-25 1 views
1

は最近、私は次のように、(公式ドキュメントについてthis cmdlet and its parametersを参照してください)Get-ChildItemFilterパラメータをunsing C:\Windows\winsxsフォルダにある*.infファイルについてPowerShellを経由してレポートを作成することでした。フィルタパラメータのGet-ChildItem実装でのFileSystem Providerエラー?

$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Filter *.inf -Recurse 

しかし私はそれを気づきました.inf_locまたは.inf_dbf42768のような他のファイル拡張子を持つファイルも結果に含まれます。一方

、予想通りIncludeパラメータのみ.infファイルを返し、動作します:

$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Include *.inf -Recurse 

私はPS版3と4を使用して現象を調べ、見つかった、もし延長ますことをしましたどんなファイルよりも正確に3文字を探している場合、それらのファイルの拡張子が長い場合でも、同じ3文字で始まる拡張子が返されます。探している拡張機能が3文字より短いか長い場合は、少なくとも私の経験に基づいてそのような問題はありません。 cmdlet descriptionで説明したように、それは、プロバイダレベルですでにフィルタリングを行うよう

パフォーマンスは、Includeパラメータよりも、私の場合に限り、私は理解して、Filterパラメータを使用すると、より効率的になり、非常に重要ではありませんが。むしろ、それらが取得された後、オブジェクトをフィルタのPowerShellのWindows を持つよりも、オブジェクトを取得する際にプロバイダー がそれらを適用するため

フィルタは、他のパラメーターよりも効率的です。

here

... -Filterパラメータは初期の生成、初期のフィルタリング、一方-含める は後早期にフィルタリングであります! 2つの方法の性能差 が重要であることが判明しました!

これは文書化された動作/バグですか?私はthe post mentioned beforeでも同様のものを見つけましたが、公式の文書では見つかりませんでした。

答えて

1

リンクされた質問ごとに、これは-Filterパラメータの制限のようです。私は別の解決策は、まだその性能の利益のために-Filterを使用しますが、あなたはWhere-Objectとその後たくない余分な結果をフィルタリングすることです推測:

Get-ChildItem -filter "*.inf" | where {$_ -match "\.inf$"} 

これは.infがである場合にのみ返すように正規表現$文字を使用していますストリングの終わり。