¿Cómo recorrer las carpetas y cambiar el nombre de las extensiones en un archivo por lotes?

2

Seleccionando una sola carpeta que podría ejecutar

ren *.jpeg *.png

Tengo varias carpetas. Quiero crear un archivo por lotes que recorrerá todas las carpetas y cambiará el nombre de los archivos que contiene.

Por ejemplo tengo carpetas TEST1 y TEST2 dentro del directorio raíz TEST. Quiero crear un lote que cambie el nombre de todos los .jpeg archivos dentro de TEST1 y TEST2 a .png.

FOR /R "E:\TEST\" %%G in (*.jpeg) DO ren *.jpeg *.png

Estoy recibiendo un error:

El sistema no puede encontrar el archivo especificado

No entiendo el problema.

user839765
fuente
Creo que el error se produce para cada carpeta que no tiene archivos "jpeg" en su interior.
kokbira

Respuestas:

3

No estás aplicando el for comando a la ren acción.

for /r "E:\test\" %%G in (*.jpeg) do ren "%%~G" *.png

Necesitas cambiar %% a % si está haciendo esto de forma interactiva, y no en un archivo por lotes.

los ~ Se eliminan las comillas, que se vuelven a agregar, para evitar posibles errores con las rutas que contienen espacios.

paradroid
fuente
ok, tu solución es más pequeña :) - Usé una vieja que tengo en mi biblioteca de bat. No probé el tuyo pero creo en ti.
kokbira
1

O, si quieres una línea un poco más corta, aquí tienes cómo hacerlo con una combinación de REN mando y el GLOBAL mando en JP Software's TCC / LE :

GLOBAL REN *.JPEG *.PNG

Utilizar GLOBAL es /I opción si desea ignorar cualquier código de salida que no sea cero de la REN comando, por supuesto.

JdeBP
fuente
0

Una solución completa está abajo.

Establecer las variables en la sección "variables":

@echo off

::only to tell user what this bat are doing
echo.1.initializing...

::enable that thing to allow, for example, incremental counter in a for loop :)
echo.- EnableDelayedExpansion
SETLOCAL EnableDelayedExpansion

::variables
echo.- variables
:: - place here the absolute root path of your files
set path2work="C:\Documents and Settings\ubirajara2\Desktop\Nova pasta"
set extension2exclude=jpeg
set extension2put=png

::only an auxiliar variable
set pathbak=%cd%

::go to %path2work% and its drive letter
echo.- entering the path you want
for /f "delims=¯" %%i in ('echo.%path2work%') do %%~di
cd %path2work%

::search all subfolders and save them to a temp file
echo.- searching for subfolders
echo.%path2work%>%temp%\tmpvar.txt
for /f "delims=¯" %%i in ('dir /s /b /on /ad') do echo."%%i">>%temp%\tmpvar.txt

::execute command for root folder and all found subfolders
echo.
echo.2.executing...
for /f "delims=¯" %%i in (%temp%\tmpvar.txt) do (
  cd %%i
  echo.- in folder: %%i
  for /f "delims=¯" %%j in ('dir /b /on /a-d *.%extension2exclude%') do (
    set newname=%%~nj.%extension2put%
    echo.- renaming from "%%j" to "!newname!"...
    ren "%%j" "!newname!"
  )
)

echo.
echo.3.exiting...
::return to %pathbak% and its driveletter
for /f "delims=¯" %%i in ('echo.%pathbak%') do %%~di
cd %pathbak%

@echo on
kokbira
fuente
aparece un "archivo no encontrado" para cada carpeta que no tiene archivos "jpeg".
kokbira
1
Whoa Cosas locas. ¿Y qué es ese negocio con %PATH%?
paradroid
bueno, cuando creé mi primera versión de un lote de renombrador, no sabía nada de pushd y popd, jaja. por lo que ":: ve a% path% y su activador" = pushd, :: regresa a% pathbak% y su activador = popd :)
kokbira
Pero creo que es tan didáctica y una solución "más controlada".
kokbira
Veo. Usted podría simplemente usar %SystemDrive% Si querías la unidad del sistema por cualquier motivo.
paradroid