2010-02-12 5 views
90

¿Es posible en el archivo por lotes de Windows llamar a más de un comando en un soloFOR bucle? Digamos, por ejemplo, quiero imprimir el nombre del archivo y después de eliminarlo:lote de Windows: ¿llamar a más de un comando en un bucle FOR?

@ECHO OFF 
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X) 
REM the line above is invalid syntax. 

Sé que en este caso pude resolverlo haciendo dos distintos bucles FOR: uno para mostrar el nombre y otra para borrar el archivo , pero ¿es posible hacerlo en un solo bucle?

Respuesta

85
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X) 
+1

En realidad, creo que los paréntesis son innecesarios. 'para% i en (1 2 3) do echo% i & echo foo' imprime lo que esperaría:" 1 "," foo "," 2 "," foo "," 3 "," foo "(en líneas separadas). – bk1e

+0

¿No debería ser '&&' en lugar de '&'? – jww

+6

@jww '&&' fallará si el primer comando falla, '&' ejecutará el segundo comando independientemente. – YoYoYonnY

156

Usando & está muy bien para los comandos cortos, pero esa sola línea puede ser muy largo 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 de DO deben colocarse en la misma línea, de lo contrario, el archivo de lote será incorrecto.

Ver if /?|find /V "" para más detalles.

+11

Esta solución se ve limpia y legible. También advertiría a cualquier programador que utilice esta solución que el corchete redondo después del 'DO' NO DEBE colocarse en la siguiente línea, de lo contrario, frenará el archivo por lotes. En el código cuando escribo un bucle for, comúnmente coloco el corchete '{' siguiente línea. –

+2

Además, tenga cuidado si alguno de sus comandos anidados tiene corchetes (por ejemplo, algo como "echo Algo algo (algo más)" EDITAR: ah, vea la respuesta de bk1e :) –

27

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 se pueda analizar, 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 
+1

Mientras hablamos sobre el tema,% X es Nunca corrija cuando trate con nombres de archivos, siempre use "% ~ X" (En su ejemplo aquí, podría salirse con la suya usando% * en la subfunción probablemente) – Anders

+1

Ese es un buen punto. Un buen ejemplo de una ruta que muestra ambos problemas es 'C: \ Archivos de programa (x86)'. – bk1e

Cuestiones relacionadas