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


Estoy tratando de conseguir mi commit-build.bat para ejecutar otro .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 de la lista (msbuild.bat).

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

Author: Darshan Rivka Whittle, 2009-07-09

13 answers

Use

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

Cuando no se usa CALL, el archivo batch actual se detiene y el archivo batch llamado comienza a ejecutarse. Es un comportamiento peculiar que se remonta a los primeros días de MS-DOS

 973
Author: Philippe Leybaert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 13:48:37

Todas las demás respuestas son correctas: use call. por ejemplo:

 call "msbuild.bat"

Historia

En las versiones antiguas de dos no era posible ejecutar recursivamente archivos por lotes. Luego se introdujo el comando call que llamó a otro shell de cmd para ejecutar el archivo por lotes y devolvió la ejecución al shell de cmd cuando terminó.

Obviamente en las versiones posteriores ya no era necesario ningún otro shell cmd.

En los primeros días muchos archivos por lotes dependían de la hecho de que llamar a un archivo por lotes no regresaría al archivo por lotes que llama. Cambiar ese comportamiento sin sintaxis adicional habría roto muchos sistemas como los sistemas de menú por lotes (usando archivos por lotes para 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 tienes todos los los nombres de los archivos por lotes, también se puede utilizar 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. Use

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

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

if errorlevel neq 0 <batch command>

Use if errorlevel 1 si tiene un Windows anterior, entonces 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.

 159
Author: Ralph M. Rickenbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 11:44:45

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

start cmd /k 

/k: es obligatorio que se ejecutará.

El lanzamiento de muchos propmts de comando se puede hacer como se muestra a continuación.

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.
 91
Author: farheen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 14:43:16

Intenta

call msbuild.bat
call unit-tests.bat
call deploy.bat
 36
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 13:49:38

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 errorlevel;
2) Usted quiere saber sobre él.

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

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

 24
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 13:52:59
call msbuild.bat
call unit-tests.bat
call deploy.bat
 19
Author: butterchicken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 13:49:51

Para llamar a un archivo .bat dentro de un archivo .bat, use

call foo.bat

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

 18
Author: Zifre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 13:50:30

Si tenemos 2 secuencias de comandos por lotes aaa.bat & bbb.bate y llame como abajo

call aaa.bat
call bbb.bat

Cuando ejecute el script, llamará a aaa.bate primero y espera el hilo de aaa.bat terminar entonces llamará bbb.mtd

Pero si no quieres esperar aaa.bat termina 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
Author: user2314621,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-29 16:31:44

Mirando sus nombres de archivo, ¿ha considerado usar una herramienta de compilación como nant o ant (la versión java)? Obtendrá mucho más control que bat files

 7
Author: Dave Archer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 13:54:47
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

Si eso no funciona, reemplaza start con call o prueba esto:

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
 5
Author: McOussKing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-15 14:44:22

Si desea abrir muchos archivos por lotes a la vez, puede usar el comando call, sin embargo, el comando call cierra el archivo bat actual y va a otro si desea abrir muchos a la vez, puede probar esto

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat" 

Y así sucesivamente o repetir inicio cmd "call..."por muchos archivos. esto funciona para WIN 7 no estoy seguro de otros sistemas.

 3
Author: CMS_95,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-24 14:29:05

Ejecutando varios scripts en uno tuve el mismo problema. Seguí haciéndolo morir en el primero sin darme cuenta de que estaba saliendo en el primer guión.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

Eliminé las 11 líneas de salida de mis scripts y lo intenté de nuevo y las 11 se ejecutaron en orden una a la vez en la misma ventana de comandos.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar
 2
Author: John Oliphant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-21 21:04:37

Simplemente use el comando call! He aquí un ejemplo:

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

Salud!

 1
Author: PryroTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 04:45:53