Пакетное переименование файлов путем вычисления значения и использования его в новом имени
У меня есть несколько сотен 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)'}}
И я получаю ошибки.
2 ответа
Ответ Райана хорош, потому что он работает без жесткой ссылки на базовое имя нового имени файла.
Я всегда переименовываю файлы по тем или иным причинам и нахожу творческие способы манипулирования строками с помощью powershell. Вот еще один способ сделать это:
gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"}
Эту однострочную строку можно использовать для переименования других файлов таким же образом, будь то файлы jpgs, gifs или 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"
Дайте мне знать, если что-то пропустил, ура:)
Нечто подобное должно работать.
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
}