He recibido tu respuesta para el tema de renombrar archivos con un bat

He copiado el código que me has mandado lo ejecuto pero me da el siguiente error.

Gracias de antemano.

1 respuesta

Respuesta
1

No sé por qué me ha llegado esta consulta y no me llegó la original. Mi tema no es VB pero sí MSDOS. La solución que te propongo para el problema original, el que figura en la otra consulta Renombrar serie archivos con bat sería utilizar el siguiente BAT:

@echo off
rem borrar primer archivo
del 0001.jpg
rem renombrar los archivos
for /l %%n in (1, 1, 999) do (call :renom %%n)
goto :eof
:renom
if %1 lss 10 (set ant=000%1
)else if %1 lss 100 (set ant=00%1
)else if %1 lss 1000 set ant=0%1
set /a nue=%1+1
if %nue% lss 10 (set nue=000%nue%
)else if %nue% lss 100 (set nue=00%nue%
)else if %nue% lss 1000 set nue=0%nue%
ren %nue%.jpg %ant%.jpg
goto :eof

Puedes probar a ver si así te funciona

Gracias, funciona perfectamente.

Ahora mi pregunta es la siguiente. Que debo modificar en el código que me has mandado, cuando no sé el numero de archivos que hay en el directorio (el numero puede variar de 100 a 2000).

Muchas gracias

Yo creo que esto funcionará si los únicos nombres "numéricos" en la carpeta son los de los JPG, si no superan el valor 9999 y si el esquema del renombrado es a "numéricos" de 4 cifras, con ceros por la izquierda:

@echo off
rem borrar primer archivo
del 0001.jpg
rem renombrar los archivos
for /f %%n in ('dir /b /on *.jpg') do (call :renom %%n)
goto :eof
:renom
echo %1
echo %~n1
set nue=%~n1
set /a nue=10000%nue%%%10000+1
if %nue% lss 10 (set nue=000%nue%
)else if %nue% lss 100 (set nue=00%nue%
)else if %nue% lss 1000 set nue=0%nue%
ren %nue%.jpg %1
goto :eof

El truco del set /a nue=10000%nue%%%10000+1 es para convertir en numéro a nivel MSDOS una cadena numérica inferior a 10000. Cosas curiosas de los BAT. Ya me dirás si te funciona.

"número" no "numéro", jua jua.

Por cierto que debo añadir que el esquema de trabajo es coger un archivo JPG de nombre numérico y renombrarlo al valor anterior, ya sin seguir una pauta "de uno en uno".

El primer código que me has mandado funciona perfectamente hasta el 1000

Primero me borra el archivo 0001.jpg y después renombra el archivo 0002.jpg como 0001.jpg y así sucesivamente hasta el 1000.jpg que pasa a ser el 0999.jpg

El segundo

borrar bien el 0001.jpg pero después en lugar de renombrar a partir del  0002.jpg-->0001.jpg

empieza en el 0003.jpg y lo renombra como del 0002.jpg y entonces da el mensaje que ya existe el archivo. He activado "echo on" y puesto un pause al final del "if" para ver los textos, te mando una captura de pantalla 

@echo off
rem borrar primer archivo
del 0001.jpg
rem renombrar los archivos
for /f %%n in ('dir /b /on *.jpg') do (call :renom %%n)
goto :eof
:renom
echo %1
echo %~n1
set nue=%~n1
set /a nue=10000%nue%%%10000+1
if %nue% lss 10 (set nue=000%nue%
)else if %nue% lss 100 (set nue=00%nue%
)else if %nue% lss 1000 set nue=0%nue%
ren %nue%.jpg %1
goto :eof

Mi código tenía un par de errores (además de no haber eliminado algunas instrucciones de depuración). La variable NUE debería tener el número anterior, no el siguiente y en el comando de renombrado, REN, deberían intercambiarse los papeles. Debería haber quedado así:

@echo off
rem borrar primer archivo
del 0001.jpg
rem renombrar los archivos
for /f %%n in ('dir /b /on *.jpg') do (call :renom %%n)
goto :eof
:renom
set nue=%~n1
set /a nue=10000%nue%%%10000-1
if %nue% lss 10 (set nue=000%nue%
)else if %nue% lss 100 (set nue=00%nue%
)else if %nue% lss 1000 set nue=0%nue%
ren %1 %nue%.jpg
goto :eof

Por otra parte utilizaba las llamadas a "subrutina" (CALL) en el bucle porque no conseguía que me funcionaran bien algunas cosas si ponía el código directamente en el FOR. Creo que ya lo he conseguido y de esa manera el BAT funciona considerablemente más rápido. Sería así:

@echo off
Setlocal EnableDelayedExpansion
rem borrar primer archivo
del 0001.jpg
rem renombrar los archivos
for /f %%n in ('dir /b /on *.jpg') do (
set nue=%%~nn
set /a nue=10000!nue!%%10000-1
if !nue! lss 10 (set nue=000!nue!
)else if !nue! lss 100 (set nue=00!nue!
)else if !nue! lss 1000 set nue=0!nue!
Echo ren %%n ! Nue!.jpg
)

Ya me contarás como van.

Antes de probar la segunda opción debes corregir un error mío y otro del editor de la página que ha cambiado ! Nue! Por ! Nue!. La última instrucción del bucle debería ser echo ren %%n ! Nue!.jpg (el echo era para pruebas y el editor de la página suele tener esa mala costumbre de añadir un espacio entre la primera admiración y lo que venga a continuación)

Lo hemos vuelto a hacer, la página incluso estando incluida en el texto, cambiando, incluso, a mayúsculas algunas cosas y yo que he dejado el ECHO. De modo que lo diré de palabra: la última instrucción debería ser:

Ren %%n

Seguido de admiración, nue, admiración.

Lo primero. Gracias por tu tiempo y tus conocimientos.

El primer código que me has mandado funciona perfectamente.

El segundo código solo me borra el 0001.jpg pero despues no me renombra los archivos.Te mando capturas de pantalla de lo que se ve visualmente al ejecutar el bat, y otra captura con el código con las rectificaciones que me comentas al final de tu mensaje, por si acaso me he equivocado o malinterpretado tus instrucciones

Cuando ejecuto el código visualmente se ve la instrucción rename con los cambios pero físicamente estos no se aplican.

Sí, claro. Era un error mío que comentaba pero un poco de pasada y no conseguí que lo entendieras, entre otras cosas porque incluso cuando pretendía aclararlo volvía a equivocarme. La última instrucción del bucle no debe llevar ECHO. Precisamente por llevarlo, indebidamente, escribe lo que viene detrás (como siempre hace un ECHO) pero no lo ejecuta. Es un truco muy utilizado en depuración y que a veces se le olvida a uno el corregirlo en la versión "definitiva". Por tanto esa última instrucción del bucle debería ser (con las correcciones ya comentadas a los errores que va a introducir el editor de la página):

ren %%n !nue!.jpg

Es decir, simplemente eliminar "echo" en lo que ya tienes.

Esta vez el editor ha sido bueno y no ha cambiado nada.

¡Gracias! 

Sigue sin funcionar el segundo código, no te preocupes pues con el primero me va muy bien.

No me resigno. Lo he probado "en real" en mi entorno, es decir sin el ECHO y por tanto renombrando archivos, y me funciona correctamente. Cópiame, por favor, lo que te sale y el contenido del BAT a ver dónde está el error.

Milagro, ya me funciona, la culpa ha sido de los "Electroduendes". A alguien hay que echarle la culpa!!!

Seguro que he sido yo a la hora de archivar el bat, como tenía varias ventanas abiertas para probar, a saber......

Lo dicho Muchas gracias por tu dedicación y tu tiempo.

Un abrazo

Me quedo más tranquilo.

Ha sido un placer (realmente disfruto con estas cosillas). Si vuelves a necesitar ayuda en cosas de MSDOS ya sabes dónde estoy.

Por descontado que si tengo alguna duda en ms-dos tu seras mi ayuda "F3".

Buen Domingo

Muy bien. (Esta respuesta es para que la página no me diga que tengo una pregunta pendiente)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas