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

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

У меня есть несколько сотен 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(".") Переименовать-Элемент -НовоеИмя { '(' + $data1+ '-290)(-1)' } }

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

решение1

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

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

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

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

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

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

будет равно [строка] "Vitrine Hinge.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"

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

решение2

Что-то вроде этого должно сработать.

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
}

Связанный контент