online - Lote de Windows: ¿llamar a más de un comando en un bucle FOR?
tag rename (3)
¿Es posible en el archivo por lotes de Windows llamar a más de un comando en un único bucle FOR
? Digamos, por ejemplo, que quiero imprimir el nombre del archivo y luego de eliminarlo:
@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.
Sé que en este caso podría resolverlo haciendo dos loops FOR distintos: uno para mostrar el nombre y otro para eliminar el archivo, pero ¿es posible hacerlo solo en un ciclo?
SilverSkin y Anders son correctos. Puede usar paréntesis para ejecutar múltiples comandos. Sin embargo, debe asegurarse de que los comandos mismos (y sus parámetros) no contengan paréntesis. cmd
busca con avidez el primer paréntesis de cierre, en lugar de manejar conjuntos anidados de paréntesis con gracia. Esto puede provocar que el resto de la línea de comando no pueda analizarse, o puede hacer que algunos de los paréntesis pasen a los comandos (por ejemplo, DEL myfile.txt)
).
Una solución para esto es dividir el cuerpo del bucle en una función separada. Tenga en cuenta que probablemente necesite saltar alrededor del cuerpo de la función para evitar "caer" en ella.
FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don''t "fall through" to :loopbody.
GOTO :EOF
:loopbody
ECHO %1
DEL %1
GOTO :EOF
Usar &
está bien para comandos cortos, pero esa sola línea puede ser muy larga muy rápido. Cuando eso suceda, cambie a la sintaxis de varias líneas.
FOR /r %%X IN (*.txt) DO (
ECHO %%X
DEL %%X
)
Colocación de (
y )
asuntos. Los corchetes después del DO
deben colocarse en la misma línea, de lo contrario, el archivo del lote será incorrecto.
Vea if /?|find /V ""
para detalles.
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)