Renomeação em lote de arquivos calculando um valor e usando-o no novo nome

Renomeação em lote de arquivos calculando um valor e usando-o no novo nome

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
}

informação relacionada