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

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

私は次のコードをPowerShellスクリプトとして実行しようとしていますが、うまくいきません。1つ目に、次のコードは1つの-Includeアイテムでは機能しますが、複数のアイテムでは機能しないようです。2つ目に、-Exclude境界が機能していないようです。私はまだファイルを取得していますC:\WindowsそしてC:\プログラムファイルディレクトリ。

$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

注: このスクリプトの目的は、システム上のすべての圧縮ファイルを見つけることです。これはおそらく非常に単純なことだと思いますが、うまく動作しないようです。

答え1

パラメータ-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

-exclude が期待通りに動作しないという dangph の意見に同意します。
-notmatch を使用する場合は、 or を使用して正規表現パターンを構築できます|
これは、修正された $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

編集除外されたフォルダーは最初のレベルなので、まったく反復処理を行わない方がはるかに高速です。そのため、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
}

関連情報