私は次のコードを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
}