
Tenho algumas centenas de JPGs que precisam ser renomeados. Preciso da seguinte equação simples aplicada ao número existente em cada nome de arquivo:
(x-290)*-1
"Vitrine Hinge.0.jpg" se tornaria "Vitrine Hinge.290.jpg", "Vitrine Hinge.1.jpg" se tornaria "Vitrine Hinge.289.jpg" e assim por diante.
Alguns dos arquivos em questão
Eu usei o seguinte:
Dir. *.jpg | ` foreach { $data = $_.name.Split(".") Renomear-Item -NewName { '(' + $data1+ '-290)(-1)' } }
E recebo erros.
Responder1
A resposta de Ryan é boa porque funciona sem uma referência rígida ao nome base do novo nome do arquivo.
Estou sempre renomeando arquivos por um motivo ou outro e encontrei maneiras criativas de manipular strings usando o PowerShell. Aqui está outra maneira de fazer isso:
gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"}
Este one-liner pode ser reutilizado para renomear outros arquivos da mesma maneira, sejam eles jpgs, gifs ou txt. O único requisito é que a última parte do nome base termine com ".#"
Então, o que está acontecendo aqui? Para resumir, digamos que $_ seja atualmente um objeto [System.IO.FileInfo] para o arquivo "Vitrine Hinge.12.jpg". Portanto:
$_.nomebase
seria igual a [string] "Vitrine Hinge.12"
$_.basename.split(".")
resultaria em uma matriz com as seguintes entradas:
Door Hinge
12
Como tal, [1] se referiria ao "12". No entanto, observe que, em vez disso, usei:
$_.basename.split(".")[-1]
Isso porque se eu tivesse um arquivo chamado "Viterine Hinge.Chrome.12.jpg", teria feito referência ao "Chrome". Usar [-1] me dará o último item da matriz e, portanto, não importaria se meu arquivo tivesse outros pontos no nome.
OK, agora, neste ponto, eu encapsulo isso em $() e uso in em meu operador -replace. Observe que termino o primeiro argumento com $ para que a regex corresponda ao final da string. Dessa forma, não importaria se meus arquivos tivessem outros números no nome. Por exemplo, "Viterine D00r Knob.0.jpg" serianãofoi renomeado para "Viterine D290290r Knob.290.jpg"
Deixe-me saber se perdeu alguma coisa, felicidades :)
Responder2
Algo assim deve funcionar.
Get-ChildItem *.Jpg|%{$SplitName=$_.name -split '\.';$NewNumber= $(([int]$SplitName[1]-290)*-1);$NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'; Rename-Item $_.name $Newname}
Seria quebrado.
$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
}