2012-02-21 20 views
13

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

cambiar esta situación:

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 
+1

ventanas y todo lo que se ejecuta en un .bat o .cmd? – Blainer

+0

Amigo, si quieres ayuda no puedes esperar que todos sean psíquicos. –

Respuesta

22

una sentencia for para recorrer los nombres (tipo FOR /? en busca de ayuda), y la cadena de búsqueda y reemplazar (tipo SET /? en busca de ayuda) .

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


ACTUALIZACIÓN - 2012-11-07

He investigado cómo el cambio de nombre de comando con ofertas de comodines: How does the Windows RENAME command interpret wildcards?

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

ren *_120x90.jpg *_67x100.* 

No importa el número de caracteres después del _. El cambio de nombre seguiría funcionando correctamente si 120x90 se convirtiera en x o xxxxxxxxxx. El aspecto importante de este problema es que se reemplaza todo el texto entre el último _ y el ..

+2

No estoy seguro de si este es un ejemplo completo. Pero [Esto] (http://stackoverflow.com/a/3811991) funcionó para mí como un encanto :) –

+2

@Anand - He agregado una solución mucho más simple usando solo el comando REN. El enlace en tu comentario es básicamente el mismo que mi respuesta original. – dbenham

+0

¿Puedes dividir tus dos respuestas? Dejaría el 'ren' one-liner en este; ¡es el mejor! –

8

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

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

Explicación

powershell -C "..." lanza una sesión de PowerShell para ejecutar el comando citado. 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.

| % {...} hace una tubería 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') utiliza 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 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
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 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
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 
+0

@MethodMan ¿qué valor debe tener la marca de tiempo? –

+0

Lo descubrí jugando con el script RobbCopy y creando una función goto dentro del archivo bat ... gracias, no estoy tan familiarizado con powershell pero si tuviera que tener un valor de marca de tiempo sería 'yyyymmddss' con una máscara eso tendría '_1 _2 _3 etc ... 'dependiendo de la cantidad de archivos ... Pude hacer esto en un archivo por lotes usando robocopy .. – MethodMan

Cuestiones relacionadas