Renomear em lote os arquivos calculando um valor e usando-o no novo nome

0

Eu 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 | ' para cada { $ data = $ _. name.Split (".") Renomear-Item -NewName {'(' + $ data 1 + '-290) (- 1)'} }

E eu recebo erros.

    
por L Wright 03.01.2018 / 00:21

2 respostas

2

A resposta de Ryan é legal porque funciona sem uma referência ao nome base do novo nome de 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 arquivos jpgs, gifs ou txt. O único requisito é que a última parte do nome da base termine com ". #"

Então, o que está acontecendo aqui? Para dividi-lo, vamos dizer que $ _ é atualmente um objeto [System.IO.FileInfo] para o arquivo "Vitrine Hinge.12.jpg". Portanto:

$_.basename

seria igual a [string] "Vitrine Hinge.12"

$_.basename.split(".")

resultaria em uma matriz com as seguintes entradas:

Door Hinge
12

Como tal, [1] refere-se ao "12". No entanto, observe que eu usei:

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

Isso porque se eu tivesse um arquivo chamado "Viterine Hinge.Chrome.12.jpg", eu 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 períodos no nome.

OK, agora, neste momento, eu encapsulo isso em $ () e uso no meu operador -replace. Note que eu termino o primeiro argumento com $ para que eu regex combine no final da string. Dessa forma, não importaria se meus arquivos tivessem outros números no nome. Por exemplo, "Viterine D00r Knob.0.jpg" não seria renomeado para "Viterine D290290r Knob.290.jpg"

Deixe-me saber se perdeu alguma coisa, Felicidades:)

    
por 05.01.2018 / 06:16
0

Algo como isso 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}

Broken Out seria.

$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
}
    
por 03.01.2018 / 22:52