2009-07-09 119 views
511

Estoy tratando de obtener mi commit-build.bat para ejecutar otros archivos .BAT como parte de nuestro proceso de compilación.Cómo ejecutar múltiples archivos .BAT dentro de un archivo .BAT

contenido de commit-build.bat:

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

Esto parece bastante simple, pero commit-build.bat sólo ejecuta el primer elemento de la lista (msbuild.bat).

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

+4

@sean - No tiene que instalar el paquete completo de Cygwin para que funcione la línea de comando. Simplemente saca todos los archivos dll de cygwin del paquete, colócalos en un directorio de patp, coloca todas tus herramientas en otro directorio de patted y listo. –

+0

suponiendo que cada uno de estos archivos son solo por lotes, por qué no simplemente ponerlos en un archivo grande y utilizar la función de tiempo de espera para permitir que cada vez que se inicie. –

Respuesta

891

uso

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

Cuando no utilice CALL, el archivo por lotes actual se detiene y la llamada archivo por lotes comienza a ejecutar. Es un comportamiento peculiar que data de los primeros días de MS-DOS

+0

raro, lo he intentado sin la "llamada" en Windows 7 y recuerdo que funcionó, pero en Windows XP necesitaba este comando. ¿podría ser? –

+3

Sin llamada, según la especificación original de DOS, debe hacer un comando de encadenamiento y NO devolver. Una opción popular antes de agregar "CALL" fue abrir un indicador de comando secundario como "command/c second.bat" ya que también volverá. –

+1

Tuve el problema en la empresa de Windows 7, así que no solo es xp – Rafiki

35

tratar

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

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

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 .)

6

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 los archivos bat

+0

¡Gracias por el consejo! –

+0

En realidad, esta es probablemente la respuesta más útil a la pregunta hasta el momento ... :-) – Zifre

148

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

call "msbuild.bat" 

Historia

En antiguas versiones de DOS que no era posible ejecutar archivos por lotes de forma recursiva. 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 ningún otro shell de 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 volvía 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, usar 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. Utilice

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 se puede llamar a reaccionar utilizando

if errorlevel neq 0 <batch command> 

uso si errorlevel 1 si tiene un Windows una edad avanzada a continuación, NT4/2000/XP para coger todos errorlevels 1 y mayores.

Para controlar el flujo de un archivo por lotes, existe :-(Goto

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

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

+0

estuvo de acuerdo, pero el ciclo podría, en este caso, procesar los archivos en el orden equivocado (alfabético?) –

+0

Gracias por el consejo ¡ejecuta archivos por lotes donde no sabes el nombre! –

19

Usted está llamando múltiple. 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.

75

Si queremos abrir el símbolo del sistema múltiple entonces SHD utilizamos

start cmd /k 

/k: es obligatorio que ejecutará.

iniciando muchos comandos de comando 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. 
+1

eso es lo que estábamos buscando, ya que nuestra primera aplicación bloquea la consola, gracias por la pista –

+1

esto ejecutará varias instancias de comando e incluso funcionará para ejecutar varios archivos por lotes que tienen . +1 ya que esta es exactamente la solución que estaba buscando! –

+0

¿podría explicar que esos números están en su respuesta? Su propósito no está claro. –

2

Ejecutando múltiples scripts en uno tuve el mismo problema. Seguí teniendo que 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 

que eliminan todos los 11 de mis líneas de guiones EXIT y volvió a intentarlo y todos corrieron 11 con el fin de uno en uno en la misma ventana de comandos.

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

::ScriptA.bat 
Do Foo 

::ScriptB.bat 
Do bar 
+0

Hola, John, bienvenido a SO. Una pequeña nota aquí: no estoy seguro si esto realmente se suma a una respuesta. Tal vez podría ser un comentario como: "Asegúrese de que no tiene ninguna llamada EXIT en sus secuencias de comandos";) – elias

+0

no elimine la 'salida's, reemplácelos con 'goto: eof' en su lugar. Esto "devolverá" a la 'llamada' – Stephan

+0

, te das cuenta de que en un lote simple, los comandos se ejecutarán en el orden en que se les llama también el diseño básico de los índices' @echo desactivado: menú algunos comandos ir al menú' nota esto ejecutará un bucle continuo hasta cerrado. básicamente, no necesitas el '::' solo ':' –

2

Si desea abrir muchos archivos por lotes a la vez puede utilizar el comando de llamada sin embargo, el comando de llamada se cierra el archivo bat actual y pasa a otro si desea abrir muchos a la vez es posible que desee probar este

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

y así sucesivamente o inicio de la repetición cmd "call ..." Sin embargo para muchos archivos. esto funciona para WIN 7 no estoy seguro acerca de otros sistemas.

9

Si tenemos 2 script por lotes aaa.bat & bbb.bat y llamamos, como a continuación

call aaa.bat 
call bbb.bat 

Al ejecutar el script, se llamará aaa.bat primero y esperar a que el hilo de terminar aaa.bat a continuación, se llame bbb.bat

Pero si usted no quiere esperar aaa.bat terminar llamar bbb.bat, intente utilizar 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 
4
Start msbuild.bat 
Start unit-tests.bat 
Start deploy.bat 

Si eso no funciona, reemplace start con call o intente esto:

Start msbuild.bat 
Goto :1 
:1 
Start unit-tests.bat 
Goto :2 
:2 
Start deploy.bat 
-1

sólo tiene que utilizar el comando call! Aquí hay un ejemplo:

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

¡Salud!

Cuestiones relacionadas