Cómo garantizar la ruta completa en el bucle FOR por lotes de Windows

Cómo garantizar la ruta completa en el bucle FOR por lotes de Windows

Creé un archivo por lotes genérico (o comando de Windows) que me permite recorrer el contenido de un directorio y llamar a un comando para cada elemento.

IF a%1==a ( set _DIR="%CD%") ELSE ( set _DIR="%~1")
IF a%2==a ( set _COMMAND=rem) ELSE ( set _COMMAND=%2)
IF a%3==a ( set _FILTER=*.*) ELSE ( set _FILTER=%3)
set _OPTS=%4

FOR /F "delims=" %%f IN ('dir %_DIR%\%_FILTER% %_OPTS% /b') DO (
%_COMMAND% "%%f"
)

Pero estoy tratando de determinar cómo asegurarme de llamar %_COMMAND%al archivo correcto.

Intenté anteponer la variable de directorio al frente, como %_COMMAND% %_DIR%\"%%f", pero esto deja una comilla en el parámetro que paso. Por ejemplo, si llamo a mi archivo por lotes exec_dir.baty lo llamo con lo siguiente echo_test.bat, veo que todos los archivos tienen comillas cuando echo_test.batse ejecutan.

echo %~dpn1.mp4

Ese script por lotes produce:

> exec_dir.bat "C:\Users\User\Desktop\Test Folder" echo_test.bat *.txt
C:\Users\User\Desktop\Test Folder\"Test File.txt
C:\Users\User\Desktop\Test Folder\"Test2.txt

Mi pensamiento es que tiene algo que ver con el \personaje de escape, pero parece que no puedo solucionarlo.

Respuesta1

establecer local
si "%~1"=="" (establecer dir=.) más (establecer dir="%~1")
if "%~2"=="" (establecer comando=echo) else (establecer comando=%~2)
if "%~3"=="" (establecer máscara=*) else (establecer máscara=%~3)
para /r %dir% %%f en (%mask%) hacer %command% %%~dpnxf

O simplemente:

C:\>para /r . %f en (*) hacer @echo %~dpnxf

información relacionada