
Tengo unos cientos de archivos JPG a los que es necesario cambiarles el nombre. Necesito la siguiente ecuación simple aplicada al número existente en cada nombre de archivo:
(x-290)*-1
"Vitrine Hinge.0.jpg" se convertiría en "Vitrine Hinge.290.jpg", "Vitrine Hinge.1.jpg" se convertiría en "Vitrine Hinge.289.jpg", y así sucesivamente.
Algunos de los archivos en cuestión.
He usado lo siguiente:
Directorio *.jpg | ` foreach { $datos = $_.nombre.Split(".") Cambiar nombre del elemento -NuevoNombre { '(' + $datos1+ '-290)(-1)' } }
Y recibo errores.
Respuesta1
La respuesta de Ryan es buena porque funciona sin una referencia estricta al nombre base del nuevo nombre de archivo.
Siempre estoy cambiando el nombre de los archivos por una razón u otra y encontré formas creativas de manipular cadenas usando PowerShell. Aquí hay otra forma de hacer esto:
gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"}
Esta frase breve se puede reutilizar para cambiar el nombre de otros archivos de la misma manera, ya sean archivos jpg, gif o txt. El único requisito es que la última parte del nombre base termine en ".#"
Entonces, ¿qué está pasando aquí? Para desglosarlo, digamos que $_ es actualmente un objeto [System.IO.FileInfo] para el archivo "Vitrine Hinge.12.jpg". Por lo tanto:
$_.nombrebase
sería igual a [cadena] "Vitrine Hinge.12"
$_.basename.split(".")
daría como resultado una matriz con las siguientes entradas:
Door Hinge
12
Como tal, [1] se referiría al "12". Sin embargo, tenga en cuenta que en su lugar utilicé:
$_.basename.split(".")[-1]
Esto se debe a que si tuviera un archivo llamado "Viterine Hinge.Chrome.12.jpg", habría hecho referencia a "Chrome". Usar [-1] me dará el último elemento de la matriz y, por lo tanto, no importaría si mi archivo tuviera otros puntos en el nombre.
Bien, ahora en este punto, lo encapsulo en $() y lo uso en mi operador -replace. Tenga en cuenta que termino el primer argumento con $ para que la expresión regular coincida al final de la cadena. De esta manera, no importaría si mis archivos tuvieran otros números en el nombre. Por ejemplo, "Viterine D00r Knob.0.jpg"nose le cambiará el nombre a "Viterine D290290r Knob.290.jpg"
Avísame si te perdiste algo, saludos :)
Respuesta2
Algo como esto debería funcionar.
Get-ChildItem *.Jpg|%{$SplitName=$_.name -split '\.';$NewNumber= $(([int]$SplitName[1]-290)*-1);$NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'; Rename-Item $_.name $Newname}
Roto sería.
$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
}