Cambiar el nombre de todos los archivos en un directorio con una secuencia de comandos de lote de Windows

¿Cómo escribiría un archivo por lotes o cmd que cambiará el nombre de todos los archivos en un directorio? Estoy usando Windows.

Cambia esto:

750_MOT_Forgiving_120x90.jpg 751_MOT_Persecution_1_120x90.jpg 752_MOT_Persecution_2_120x90.jpg 753_MOT_Hatred_120x90.jpg 754_MOT_Suffering_120x90.jpg 755_MOT_Freedom_of_Religion_120x90.jpg 756_MOT_Layla_Testimony_1_120x90.jpg 757_MOT_Layla_Testimony_2_120x90.jpg 

A esto:

 750_MOT_Forgiving_67x100.jpg 751_MOT_Persecution_1_67x100.jpg 752_MOT_Persecution_2_67x100.jpg 753_MOT_Hatred_67x100.jpg 754_MOT_Suffering_67x100.jpg 755_MOT_Freedom_of_Religion_67x100.jpg 756_MOT_Layla_Testimony_1_67x100.jpg 757_MOT_Layla_Testimony_2_67x100.jpg 

Una instrucción FOR para recorrer los nombres (escriba FOR /? Para obtener ayuda), y buscar y reemplazar cadenas (escriba SET /? Para obtener ayuda).

 @echo off setlocal enableDelayedExpansion for %%F in (*120x90.jpg) do ( set "name=%%F" ren "!name!" "!name:120x90=67x100!" ) 

ACTUALIZACIÓN – 2012-11-07

Investigué cómo el comando RENAME trata con comodines: ¿cómo interpreta el comando RENAME de Windows los comodines?

Resulta que este problema en particular se puede resolver muy fácilmente utilizando el comando RENAME sin necesidad de un script por lotes.

 ren *_120x90.jpg *_67x100.* 

La cantidad de caracteres después de _ no importa. El cambio de nombre seguiría funcionando correctamente si 120x90 convirtiera en x o xxxxxxxxxx . El aspecto importante de este problema es que todo el texto entre el último _ y el . es remplazado.

A partir de Windows 7 puede hacer esto en una línea de PowerShell.

 powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" 

Explicación

powershell -C "..." inicia una sesión de PowerShell para ejecutar el comando entre comillas. Vuelve a la capa exterior cuando se completa el comando. -C es la abreviatura de -Command .

gci devuelve todos los archivos en el directorio actual. Es un alias para Get-ChildItem .

| % {...} | % {...} crea una canalización para procesar cada archivo. % es un alias para Foreach-Object .

$_.Name es el nombre del archivo actual en la tubería.

($_.Name -replace '120x90', '67x100') usa el operador -replace para crear el nuevo nombre de archivo. Cada aparición de la primera subcadena se reemplaza con la segunda subcadena.

rni cambia el nombre de cada archivo. El primer parámetro (llamado -Path ) identifica el archivo. El segundo parámetro (llamado -NewName ) especifica el nuevo nombre. rni es un alias para Rename-Item .

Ejemplo

 $ dir Volume in drive C has no label. Volume Serial Number is A817-E7CA Directory of C:\fakedir\test 11/09/2013 16:57  . 11/09/2013 16:57  .. 11/09/2013 16:56 0 750_MOT_Forgiving_120x90.jpg 11/09/2013 16:57 0 751_MOT_Persecution_1_120x90.jpg 11/09/2013 16:57 0 752_MOT_Persecution_2_120x90.jpg 3 File(s) 0 bytes 2 Dir(s) 243,816,271,872 bytes free $ powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" $ dir Volume in drive C has no label. Volume Serial Number is A817-E7CA Directory of C:\fakedir\test 11/09/2013 16:57  . 11/09/2013 16:57  .. 11/09/2013 16:56 0 750_MOT_Forgiving_67x100.jpg 11/09/2013 16:57 0 751_MOT_Persecution_1_67x100.jpg 11/09/2013 16:57 0 752_MOT_Persecution_2_67x100.jpg 3 File(s) 0 bytes 2 Dir(s) 243,816,271,872 bytes free