Переименовать несколько файлов со специальными символами в именах файлов - PullRequest
0 голосов
/ 30 декабря 2018

Попытка удалить первые несколько символов из большого количества файлов в одном каталоге, но возникли проблемы со специальными символами в именах файлов.Мне также нужно использовать подстановочный знак, чтобы указать, какой текст следует удалить, поскольку этот текст может содержать одно или двухзначное число.

Я новичок в использовании v2.0.1.1.

anПример имени файла:

(2) S17- 22429 E1_[49946,12147]_composite_image.jpg

Мне нужно удалить начальное число в скобках вместе со следующим пробелом.число в скобках может состоять из одной или двух цифр, поэтому необходимо использовать подстановочный знак.

Результирующее имя файла должно быть:

S17- 22429 E1_[49946,12147]_composite_image.jpg

Все файлы будут содержать координаты, разделенные знаком «,» в квадратескобки, и все они будут .jpg, но все остальное в именах окончательных имен будет различаться.

Читая различные статьи о кусочках и кусочках того, что идет не так, попробовал код ниже.

Проблема, кажется, в квадратных скобках и, возможно, запятой, но только методы, которые я могу найти (`` [и т. Д.), Говорят вам, как обращаться с ними в строке поиска, а не в той части строки, которая вас не интересует.in. -literalpath, похоже, тоже не помогает.

dir | rename-item -NewName { ($_.name) -Replace("\(*\) ","")}

И пробовал различные изменения этого базового кода.

Запускает каждый файл, но все с:

Rename-Item : Cannot rename because item at 'Microsoft.PowerShell.Core\FileSystem::C:\...\(2) S17- 22429 E1_[49946,12147]_composite_image.jpg' does not exist.
At line:1 char:19
+ dir | rename-item <<<<  -NewName { ($_.name) -Replace("\(*\) ","")}
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Похоже, у Rename-Item действительно есть проблемы со специальными символами.Когда командлеты терпят неудачу, часто полезно искать методы объекта.Попробуй это.У меня работает на PS 5.1

gci *.jpg | % {
  $_.MoveTo("$($_.DirectoryName)\$($_.Name -replace '\(.*\) ','')")
}
0 голосов
/ 30 декабря 2018

Работает для меня, если я делаю:

Get-ChildItem -Path 'D:\' -Filter '*.jpg' | 
    ForEach-Object { $_ | Rename-Item -NewName ($_.Name -replace '^\(\d+\)\s*', '')}

Это предполагает, что имя файла всегда начинается с цифры в скобках.Если между этими скобками может быть любой символ (или даже ничего), выполните ($_.Name -replace '^\(.*\)\s*', '')


РЕДАКТИРОВАТЬ

Очевидно, что для переименования нескольких файлов через конвейер требуется синтаксис для Rename-Itemбыть блоком скрипта, как показано в четвертом примере в документах .

Если вы сделаете это:

Get-ChildItem -Path 'D:\' -Filter '*.jpg' | Rename-Item -NewName { $_.Name -replace '^\(\d+\)\s*', '' }

Это работает.
Итак,вы почти все поняли правильно, за исключением двух вещей:

  • вы добавили круглые скобки к параметру -replace
  • вы добавили квантификатор регулярных выражений * непосредственно послеоткрывающая скобка, поэтому ваше регулярное выражение запрашивает ноль или более ( символов вместо того, что находится между скобками в имени файла

Надеюсь, это поможет

0 голосов
/ 30 декабря 2018

Нет необходимости в сложных сценариях powershell, вы можете сделать это в простом CMD.

Это переименует файлы с длиной 1 номер:

for %a in ("(?) *.*") do ren "%a" "////*.*"

И это для номера 2 длины:

for %a in ("(??) *.*") do ren "%a" "/////*.*"

у вас может возникнуть соблазн:

for %a in ("(*) *.*") do ren "%a" "////*.*"

, но в итоге вы получите имена файлов с пробелами в начале, если они имеют номера длиной 2+.

Как это работает?

Давайте сначала посмотрим на переименование. Итак, если у вас есть это имя файла: (2) S17- 22429 E1_[49946,12147]_composite_image.jpg, мы хотим сделать следующее:

ren "(?) S17- 22429 E1_[49946,12147]_composite_image.jpg" "////*.*";

Знак вопроса ? означаетлюбой символ одной длины.Звездочка * означает любые много символов./ означает сброс этого одного символа.

, поэтому (2) S17- 22429 E1_[49946,12147]_composite_image.jpg => S17- 22429 E1_[49946,12147]_composite_image.jpg

для двух чисел длины вам понадобится два ??и пять ///// вот так:

ren "(??) S17- 22429 E1_[49946,12147]_composite_image.jpg" "/////*.*";

Мы используем пробел после ), чтобы шаблон был более строгим.

Затем мы используем:

for %a in (`condition`) do `command`

он выполняет итерацию для каждого файла в условии и затем выполняет команду.% a - это специальный подстановочный знак, который вы можете использовать в команде для получения имени файла.

В общем, что мы делаем для каждого файла, переименовывая отбрасывая первые 4 или 5 символов, и мы используем?при условии, что мы получим все файлы, которые соответствуют шаблону.

и вуаля, вы также можете адаптироваться к вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...