web-dev-qa-db-ja.com

Powershell Get-ChildItem Include \ Exclude-単純なスクリプトが正しく機能しない

次のコードをpowershellスクリプトとして実行しようとしていますが、機能しません。 1つ目は、次は1つの-Includeアイテムですが、複数のアイテムで動作するようには思えません。第二に、-Exclude境界が機能していないようです。 C:\ WindowsおよびC:\ Program Filesディレクトリからファイルを取得します。

$Include = "*.Zip","*.rar","*.tar","*.7Zip"
$exclude = "C:\Windows","C:\Program Files"
Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName

注:このスクリプトの目的は、システム上のすべての圧縮ファイルを検索することです。私はこれがおそらく本当に単純であることを知っていますが、私はそれを機能させることができないようです。

6
securityghost

-Excludeパラメータが実際に正しく機能したことはありません。 Nameプロパティと一致しているようですが、これは通常あまり役に立ちません。おそらく自分でフィルタリングを行う必要があります。

$Include = "*.Zip","*.rar","*.tar","*.7Zip"
Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue | 
    ? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } |
    Select-Object -ExpandProperty FullName

(ちなみに、-Filter-Includeよりもはるかに高速です。欠点は、-Includeのようにパターンの配列を指定できないことです。しかし、それでも可能性があります。 4回検索する必要があったとしても、高速になります。はっきりとは言えません。速度が重要かどうかをテストする価値があるかもしれません。)

2
dangph

-excludeが期待どおりに機能しないことを私はdangphに同意します。
-notmatchを使用する場合、または|を使用して正規表現パターンを作成できます。
これは、修正された$ includeで機能します。

$Include = @('*.Zip','*.rar','*.tar','*.7Zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0| 
  Where FullName -notmatch $exclude|
  Select-Object -ExpandProperty FullName

EDit除外されたフォルダは第1レベルであるため、それらをまったく繰り返さない方がはるかに高速であるため、2つのステップによるアプローチの方が効率的です。

$Include = @('*.Zip','*.rar','*.tar','*.7Zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'

Get-ChildItem "C:\" -Directory |
  Where FullName -notmatch $exclude|ForEach {
  Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0| 
  Select-Object -ExpandProperty FullName
}
4
LotPings