私は、私のWindowsコンピュータ上の多くの不要なファイルのファイル名の共通の特徴を知っています。単一の 正規表現 PowerShellコマンドを使用して、特定のフォルダーまたはフォルダー階層からこれらのファイルをすべて削除するにはどうすればよいですか?
Get-ChildItemコマンドを、RegExパターンを受け入れるWhere-Objectフィルターを介してパイプ処理し、それをRemove-Itemにパイプ処理できます。 Select-Stringを使用するよりも速く、より良い結果が得られると思います。次のようなコマンドで:
Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
Name属性は、ファイルの拡張子とともに、ファイルまたはフォルダーの名前とのみ一致します。パスに沿った他のものとは一致しません。これにより、パイプを介してFileInfoオブジェクトが渡されます。このパイプは、Remove-Itemがパイプ入力として受け取り、問題のファイルを削除します。
パスのサブフォルダーを含める場合は、-RecurseスイッチをGet-ChildItemコマンドに追加すると、次のようになります。
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
ファイルのみを削除する場合は、FileInfoオブジェクトのPSIsContainerプロパティを確認し、次のような感嘆符をオブジェクトの前に付けることでそれを反転することにより、Whereステートメントでそれを指定できます。
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
次のコマンドを使用できます。
ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}
引用符の内容は正規表現です。この例の正規表現は、ファイル名に(#)が含まれるファイルを検索します。#は負でない整数です。これは、ミュージックマネージャなどによって、同じファイルのセットが何度もダンプされたフォルダ内の重複を削除する場合に役立ちます。
-nameの後に-rを追加した場合
ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}
サブフォルダを再帰し、すべてのサブフォルダ内の一致するファイルを削除します。
コマンドの構造は次のとおりです。
私はこれを使います:
(Get-ChildItem -Path $Path | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
または、V3以降を使用していて、自動メンバー列挙がある場合:
(Get-ChildItem -Path $Path).Fullname -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse).Fullname -match <regex> | Remove-Item
名前は、現在の作業ディレクトリがファイルを削除するディレクトリであり、すべてのファイルがそのディレクトリにある場合にのみ機能します(再帰により、同じ名前でパスが異なる複数のファイルが見つかる場合があります)。