Пакетное переименование файлов путем вычисления значения и использования его в новом имени

414
L Wright

У меня есть несколько сотен JPG, которые нужно переименовать. Мне нужно следующее простое уравнение, примененное к существующему числу в каждом имени файла:

(Х-290) * - 1

"Vitrine Hinge.0.jpg" станет "Vitrine Hinge.290.jpg", "Vitrine Hinge.1.jpg" станет "Vitrine Hinge.289.jpg" и так далее.

Некоторые из рассматриваемых файлов

Я использовал следующее:

Dir * .jpg | `foreach {$ data = $ _. name.Split (". ") Rename-Item -NewName {'(' + $ data 1 + '-290) (- 1)'}}

И я получаю ошибки.

0
Пакетное переименование файлов является распространенным вопросом для SU. Вы исследовали предыдущие решения? Вы работаете с кодом и застряли с конкретной проблемой? root 6 лет назад 0
@ корень я исследовал. L Wright 6 лет назад 0
Я использовал это как простое переименование пакета: Dir * .jpg | ForEach-Object -begin {$ count = -146} -process . Но это не имеет никакого отношения к порядку файлов, и изменяет порядок. L Wright 6 лет назад 0
если целое число всегда после первого `.`, вы можете использовать это:` gci. * .jpg | % {$ int = $ _. Name.Split (".") [1]; $ number = ($ int - 290) * -1; rni $ _. FullName -NewName ($ _ -Заменить $ int, $ number)} ` SimonS 6 лет назад 0
Вместо `` (x-290) * - 1``, ​​почему бы просто не сказать `` 290-x``? G-Man 6 лет назад 0

2 ответа на вопрос

2
Ricc Babbitt

Ответ Райана хорош, потому что он работает без жесткой ссылки на базовое имя нового имени файла.

Я всегда переименовываю файлы по той или иной причине и находил творческие способы манипулирования строками с помощью powershell. Вот еще один способ сделать это:

gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"} 

Эту однострочную строку можно использовать для переименования других файлов таким же образом, будь то файлы jpgs, gif или txt. Единственное требование - последняя часть базового имени заканчивается на «. #».

Итак, что здесь происходит? Чтобы разбить его, скажем, $ _ в настоящее время является объектом [System.IO.FileInfo] для файла "Vitrine Hinge.12.jpg". Следовательно:

$ _. Базовое имя

будет равно [строка] "Витрин Петля.12"

$_.basename.split(".") 

приведет к массиву со следующими записями:

Door Hinge 12 

Таким образом, [1] будет ссылаться на «12». Однако обратите внимание, что я вместо этого использовал:

$_.basename.split(".")[-1] 

Это потому, что если бы у меня был файл с именем «Viterine Hinge.Chrome.12.jpg», я бы сослался на «Chrome». Использование [-1] даст мне последний элемент в массиве, и поэтому не будет иметь значения, если в моем файле есть другие точки в имени.

Хорошо, теперь на этом этапе я инкапсулирую это в $ () и использую в в моем операторе -replace. Обратите внимание, что первый аргумент заканчивается на $, чтобы в конце строки было найдено регулярное выражение. Таким образом, не имеет значения, если в моих файлах есть другие номера в имени. Например, «Viterine D00r Knob.0.jpg» не будет переименован в «Viterine D290290r Knob.290.jpg»

Дайте мне знать, если что-то пропустил, ура :)

0
Ryan McVicar

Нечто подобное должно работать.

Get-ChildItem *.Jpg|%{$SplitName=$_.name -split '\.';$NewNumber= $(([int]$SplitName[1]-290)*-1);$NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'; Rename-Item $_.name $Newname} 

Разбитый это было бы.

$Files=Get-ChildItem *.jpg Foreach ($File in $files){ $SplitName=$File.name -split '\.'; $NewNumber= $(([int]$SplitName[1]-290)*-1) $NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.' Rename-Item $_.name $Newname } 
Спасибо Райан. Друг ФБ помог мне и придумал: gci * .jpg | foreach {$ data = $ _. name.Split ("."); $ index = ([int] $ data [1] -290) * (- 1); rni $ _ "Петля Витрина. $ index.jpg"} L Wright 6 лет назад 0
`gci * .jpg | foreach {$ data = $ _. name.Split ("."); $ index = ([int] $ data [1] -290) * (- 1); rni $ _ "Петля Витрина. $ index.jpg"} ` L Wright 6 лет назад 0