2009-10-06 24 views
19

Me gustaría cambiar el nombre de todos los archivos jpg en una carpeta para uniformizar la convención como Picture00000001.jpg donde 00000001 es un contador.¿Cómo recorrer los archivos y renombrarlos con PowerShell?

Sería un paseo por el parque en C#, pero creo que este es el tipo de cosas de pan y mantequilla para las que se creó PowerShell.

supongo algo así como

$files = ls *.jpg 
$i=0 
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" } 

Pero antes de que golpee el gas en este Quisiera 1) formatear el mostrador, y 2) tener algún sentido de que se trata, de hecho, incluso una buena idea .

Si esto suena más como TOC que una buena idea por favor hable.

Respuesta

23

Usted puede hacer esto de manera bastante simple en PowerShell:

ls *.jpg | Foreach -Begin {$i=1} ` 
    -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif} 

Si' Está buscando el "nombre base" y si tiene PowerShell 2.0 solo use la propiedad Basename que PowerShell agrega a cada objeto FileInfo:

ls *.jpg | Format-Table Basename 

Tenga en cuenta que en PowerShell 1.0, el PowerShell Community Extensions agrega esta misma propiedad de Basename.

Si la intención es añadir una cadena en contra de nombre base del archivo durante la operación de cambio de nombre a continuación, intente esto:

ls *.jpg | Foreach {$i=1} ` 
    {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif} 
+0

Lo siento por la falta de conexión entre el título y la pregunta - He cambiado el título. –

+0

No hay problema, he actualizado mi respuesta en consecuencia. –

+0

Whoa, puede asignar un bloque de script 'begin' y' process' individualmente a 'ForEach-Object'? Tengo que volver a visitar algunos problemas de PE de golf. – Joey

2

Prueba esto para obtener el FilenameWithOutExtension

$ f.DirectoryName + "\" + $ f.BaseName

Cuestiones relacionadas