
複数の文字を含むファイル名を検索し、その後の文字をすべて削除する簡単な方法があるかどうか知りたいです。
たとえば、次のようなファイルがあるとします。
Great Movie Title 2021 1080p asldkfjalfj.mkv
Another Great Movie 1997 480p aldfasdfa.avi
Boring movie but its ok 2015 720p asadfqwr.mp4
1080p
ファイル名で、、720p
を見つけて480p
、その後のすべてを削除したいです。
Windows バッチ ループを使用できることはわかっていますFor
が、検索には 1 文字しか使用できません。これが可能なサードパーティ アプリであっても、見つけることができないようです。
答え1
ドライブ全体を検索しますか、それとも単一のディレクトリだけを検索しますか?
いずれにしても、PowerShell はこれを処理できます。
これにより、C ドライブ全体が処理され、ファイル名に 1080p が含まれるものはすべて名前が変更されます。
cd c:\
Get-ChildItem -recurse -include *1080p* | foreach-object { $name = $_.fullname; $newname = $name -replace '1080p.*\.','1080p.'; rename-item $name $newname }
その後、480p と 720p でもこれを繰り返すことができます。
答え2
パワーシェルそれが正しい道です。
すべてを 1 回のパスで取得し、簡単に変更できる別のアプローチを次に示します。
これは最上位のフォルダから実行されます。 はとは異なり、値の配列を取ることができる-Path
ため、これにより (ここでは位置指定の) パラメータが解放され、複数のファイルタイプでフィルタリングできるようになります。-Path
-Filter
Get-ChildItem *.mkv, *.avi, *.mp4 -Recurse | ForEach {
If ( $_.BaseName -match '^.+(1080p|720p|480p)' ) {
Rename-Item -LiteralPath $_.FullName -NewName ( $matches[0] + $_.Extension )
}
}
正規表現は、'^.+(1080p|720p|480p)'
ファイル名の先頭から「or'd」( ) 解決文字列のいずれかまでのすべての文字と一致します|
。そのテキストは$matches
自動変数に保存され、新しい名前を作成するために使用されます。