2009-11-25 7 views
4

У меня есть список файлов, как это:...
Test (file1) [Текст] .txt
Test (file2) [Текст] .txt
Test (file3) [текст] .txtПереименование файлов для удаления периодов в Powershell

Мне нужно удалить любые "()", "[]" и любые ".", заменить их пробелы без изменения расширения файла. Я попытался следующие, но это не работает:

dir C:\scratch\*.txt | % { Rename-Item $_ ($_.basename -replace "\(", " "` 
      -replace "\)", " "` 
      -replace "\[", " "` 
      -replace "\]", " "` 
      -replace ".", " ")} 

В идеале имя файла должно заканчиваться в формате «Test file1 text.txt»

ответ

6

IMO Rename-Item выглядит сломанным с точки зрения его обработки путей с помощью [] символов в них. К счастью, Move-Item работы:

dir *.txt | 
    mi -dest {($_.Basename -replace '[()[\].]+',' ').Trim() + $_.Extension} 

Где mi является псевдонимом для Move-Item. Обратите внимание, что несколько командлетов, таких как Rename-Item и Move-Item, могут быть переданы напрямую, а затем их параметры NewName/Destination могут принимать сценарии, в которых вы можете использовать объект конвейера. Внутри это работает для связанных с конвейером параметров, поскольку PowerShell выполнит скриптовый блок и попытается принудить результат к типу, ожидаемому параметром.

+0

Оба ответа работают нормально, я дал ответ на этот вопрос из-за более простого регулярного выражения. Один вопрос, хотя: работа над выше оставила бы два пробела, где могли бы быть смежные символы вместе. Должен ли я добавить еще один -replace '\ s +', ''? И как мне заменить пространство в конце строки? \ z, похоже, не делает этого. – fenster

+0

См. Обновленное регулярное выражение в ответе: [() [\\].] -> + <- и добавление Trim(). –

6

Rename-Item не работает с файлами, содержащими "[" или "]". Это known issue.

Оказывается, проблема состоит в том, что при переименовании элемента отсутствует параметр -LiteralPath. Move-Item имеет этот параметр, так что вы можете использовать его, чтобы делать то, что вы хотите:

ls C:\scratch\*.txt | 
    % { Move-Item -literalpath $_.fullname ` 
     ($_.name -replace "[()\[\]]|\.(?!\w{3}$)", " ") -whatif } 

Удалить параметр -WhatIf, когда он выглядит, как он делает то, что вы хотите, чтобы это сделать. Мое регулярное выражение оставляет такие файлы, как «Test     file1     text.txt», который не совсем то, что вы хотели.

0

Если вам не нужно делать это программно, используйте вместо этого http://www.bulkrenameutility.co.uk/Screenshots.php. Я использую это в течение многих лет, чтобы переименовывать изображения, и кучу других вещей!

1

вы могли бы сделать это с помощью rename вместо:

$ rename --regex --find '\.(?!\w+$)' --replace ' ' * 

Эта команда заменяет все торможений (периоды) с пробелом, без изменения расширения файла.

Смежные вопросы