
Мне было интересно, есть ли быстрый и простой способ поиска имен файлов, состоящих из нескольких символов, и удаления всех символов после них.
Например, если у меня есть файл с именем:
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 Batch For
loop, но для его поиска можно использовать только один символ. Даже если это стороннее приложение, которое может это сделать, но я не могу его найти.
решение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
PowerShellэто верный путь.
Вот еще один подход, который может сделать все это за один проход и легко модифицировать.
Это будет запущено из папки верхнего уровня. Это освобождает -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
автоматическом переменном и используется для построения нового имени.