¿Cómo puedo hacer que mi archivo .bat continúe después de un error?

30

Tengo un archivo .bat en Windows que hace tres cosas

cmd1 arg1 arg2
cmd2 arg3 
cmd3 arg4 arg5 arg6

A veces, cmd1 puede fallar y está bien, me gustaría continuar y ejecutar cmd2 y cmd3. Pero mi bate se detiene en cmd1. ¿Cómo puedo evitar esto?

Actualización para mayor claridad: estos no son otros archivos .bat, son comandos exe. Espero no tener que construir un árbol de archivos .bat solo para lograr esto.

Confundido
fuente
Debería poder iniciar el comando usando cmd /C.
Der Hochstapler
1
Debe mostrar un ejemplo de código específico de lo que no funciona. Los archivos por lotes normalmente no finalizan automáticamente si un comando falla con un error. Los archivos por lotes terminan si hay un error de sintaxis. Si su código está saliendo por un error exe, entonces debe haber lógica en su código que esté causando ese comportamiento.
dbenham

Respuestas:

18

Otra opción es usar el amperstand ( &)

cmd1 & cmd2 & cmd3

Si usa un doble, solo continúa si el comando anterior se completa con éxito ( %ERRORLEVEL%==0)

cmd1 && cmd2 && cmd3

Si usa un doble tubo ( ||), solo ejecuta el siguiente comando si el anterior se completa con un código de error ( %ERRORLEVEL% NEQ 0)

cmd1 || cmd2 || cmd3

El canadiense Luke REINSTATE MONICA
fuente
¿Puedo hacer esto al pasar args también? Solo lo intenté y no pareció funcionar.
ConfusedNoob
@ConfusedNoob Lo hago todo el tiempo ... Tengo un CHKDSKcomando, con argumentos, que funciona. Escribo check D: & check E: & check F:y funciona. Los argumentos que tiene el archivo BAT incluyen los /perf /f /r /b /scaninterruptores
Canadian Luke REINSTATE MONICA
2
bueno uno! me dio una idea de cómo implementar varios reintentos: cmd || cmd || ... ejecutará el próximo cmd hasta que tenga éxito
iTake
1
Esto hace que las secuencias de comandos largas sean ilegibles, ¿no hay otra manera?
Jan
1
@CanadianLuke Well batch es el marco de trabajo por lotes de Windows. ¿Cómo ejecutas cientos de comandos de forma no interactiva? ¿Hay un mejor enfoque en el shell de poder? ¿Es peor mudarse allí?
Jan
11

Suponiendo que los cmds son otros archivos .bat que apilan los comandos de esta manera:

 call cmd1
 call cmd2
 call cmd3
mdpc
fuente
10

Esto funcionó para mí:

cmd.exe /c cmd1 arg1
cmd2
...

Esto se usa cmd.exepara ejecutar el comando en una nueva instancia del intérprete de comandos de Windows, por lo que un comando fallido no interrumpe el script por lotes. La /cbandera le dice al intérprete que finalice tan pronto como el comando termine de ejecutarse.

cmd2se ejecuta incluso si falla el primer comando. Consulte cmd /?desde el símbolo del sistema de Windows para obtener más información.

Joseph238
fuente