Pregunta Cómo ejecutar múltiples archivos .BAT dentro de un archivo .BAT


Estoy tratando de obtener mi commit-build.bat para ejecutar otros archivos .BAT como parte de nuestro proceso de compilación.

Contenido de commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

Esto parece bastante simple, pero commit-build.bat solo ejecuta el primer elemento en la lista (msbuild.bat)

He ejecutado cada uno de los archivos por separado sin problemas.


547
2017-07-09 13:47


origen


Respuestas:


utilizar

call msbuild.bat
call unit-tests.bat
call deploy.bat

Cuando no se usa CALL, el archivo por lotes actual se detiene y el archivo por lotes llamado se inicia la ejecución. Es un comportamiento peculiar que se remonta a los primeros días de MS-DOS


948
2017-07-09 13:48



Todas las otras respuestas son correctas: use la llamada. por ejemplo:

 call "msbuild.bat"

Historia

En las versiones antiguas de dos no era posible ejecutar recursivamente los archivos por lotes. A continuación, se introdujo el comando de llamada que llamó a otro shell cmd para ejecutar el archivo por lotes y devolvió la ejecución al shell cmd que realiza la llamada cuando finalizó.

Obviamente, en versiones posteriores ya no era necesario otro shell cmd.

En los primeros días, muchos archivos de proceso por lotes dependían del hecho de que llamar a un archivo por lotes no regresaba al archivo de proceso por lotes llamado. Cambiar ese comportamiento sin sintaxis adicional habría roto muchos sistemas, como los sistemas de menú por lotes (utilizando archivos de proceso por lotes para las estructuras de menú).

Como en muchos casos con Microsoft, la compatibilidad con versiones anteriores es la razón de este comportamiento.

Consejos

Si sus archivos por lotes tienen espacios en sus nombres, use comillas alrededor del nombre:

call "unit tests.bat"

Por cierto: si no tiene todos los nombres de los archivos por lotes, también podría usar para hacer esto: (no garantiza el orden correcto de las llamadas a archivos por lotes, sigue el orden del sistema de archivos)

FOR %x IN (*.bat) DO call "%x"

También puede reaccionar en niveles de error después de una llamada. Utilizar

exit /B 1   # or any other integer value in 0..255

para devolver un nivel de error 0 denota ejecución correcta. En el archivo por lotes de llamada, puede reaccionar usando

if errorlevel neq 0 <batch command>

Use if errorlevel 1 si tiene un Windows anterior y luego NT4 / 2000 / XP para capturar todos los niveles de error 1 y superiores.

Para controlar el flujo de un archivo por lotes, hay goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Como otros señalaron: eche un vistazo a los sistemas de compilación para reemplazar los archivos por lotes.


155
2017-07-09 14:02



Si queremos abrir el símbolo del sistema múltiple, entonces podríamos usar el

start cmd /k 

/k: es obligatorio que se ejecutará.

El lanzamiento de muchos comandos de comandos se puede hacer de la siguiente manera.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.

88
2017-08-27 05:17



tratar

call msbuild.bat
call unit-tests.bat
call deploy.bat

36
2017-07-09 13:49



Está llamando a varios lotes en un esfuerzo por compilar un programa. Doy por sentado que si ocurre un error:
1) El programa dentro del lote saldrá con un nivel de error;
2) Quieres saber sobre eso.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' prueba para un nivel de error superior a 0. De esta forma, todos los lotes se ordenan en orden, pero se detendrán ante cualquier error, dejando la pantalla tal como está para que pueda ver cualquier mensaje de error.


24
2017-08-18 12:40



call msbuild.bat
call unit-tests.bat
call deploy.bat

19
2017-07-09 13:49



Llamar a un .bat archivo dentro de un .bat archivo, uso

call foo.bat

(Sí, esto es tonto, tendría más sentido si pudieras llamarlo con foo.bat, como podría hacerlo desde el símbolo del sistema, pero la forma correcta es usar call.)


18
2017-07-09 13:50



Si tenemos 2 secuencias de comandos por lotes aaa.bat & bbb.bat y llamemos a continuación

call aaa.bat
call bbb.bat

Cuando ejecute el script, Primero llamará aaa.bat y esperará a que el hilo de aaa.bat termine y luego llamará a bbb.bat

Pero si no quiere esperar que aaa.bat termine para llamar a bbb.bat, intente usar el comando START

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

Examen:

start /b aaa.bat
start /b bbb.bat

13
2017-10-29 16:31