batch-file - simple - script batch file commands
Cómo ejecutar varios archivos.BAT dentro de un archivo.BAT (13)
Estoy tratando de hacer que commit-build.bat
ejecute 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.
¡Solo usa el comando de call
! Aquí hay un ejemplo:
call msbuild.bat
call unit-tests.bat
call deploy.bat
Ejecutando múltiples scripts en uno tuve el mismo problema. Seguí haciéndolo morir en el primero sin darme cuenta de que estaba saliendo en el primer script.
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT
Quité todas las 11 líneas de EXIT de mis scripts e intenté nuevamente 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
Está llamando a varios lotes en un esfuerzo por compilar un programa. Doy por sentado que si se produce un error:
1) El programa dentro del lote se cerrará con un nivel de error;
2) Quieres saberlo.
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
''||'' busca un nivel de error superior a 0. De esta manera, todos los lotes se llaman en orden, pero se detendrán en cualquier error, dejando la pantalla como está para que usted vea cualquier mensaje de error.
Mirando sus nombres de archivo, ¿ha considerado usar una herramienta de compilación como NAnt o Ant (la versión de Java)? Tendrás mucho más control que con los archivos bat.
Para llamar a un archivo .bat
dentro de un archivo .bat
, use
call foo.bat
(Sí, esto es una tontería, tendría más sentido si pudiera llamarlo con foo.bat
, como podría foo.bat
desde la línea de comandos, pero la forma correcta es usar la call
).
Si desea abrir muchos archivos por lotes a la vez, puede usar el comando de llamada. Sin embargo, el comando de llamada cierra el archivo bat actual y va a otro. Si desea abrir muchos a la vez, puede intentar esto:
@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"
Y así sucesivamente o repita iniciar cmd
" call
..." para muchos archivos. Esto funciona para Windows 7 , pero no estoy seguro acerca de otros sistemas.
Si queremos abrir múltiples instrucciones de comando entonces podríamos usar
start cmd /k
/k
: es obligatorio el que ejecutará.
El lanzamiento de muchas instrucciones 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.
Si tenemos dos scripts por lotes, aaa.bat y bbb.bat, y llamamos como abajo
call aaa.bat
call bbb.bat
Al ejecutar el script, primero llamará aaa.bat, esperará a que finalice el subproceso de aaa.bat y llame a bbb.bat.
Pero si no desea esperar a 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
Todas las otras respuestas son correctas: use call. Por ejemplo:
call "msbuild.bat"
Historia
En las versiones antiguas de DOS no era posible ejecutar archivos por lotes de forma recursiva. Luego se introdujo el comando de llamada que llamaba a otro shell cmd para ejecutar el archivo por lotes y devolvía la ejecución al shell cmd de llamada cuando terminaba.
Obviamente, en versiones posteriores ya no era necesario ningún otro shell cmd.
En los primeros días, muchos archivos por lotes dependían del hecho de que llamar a un archivo por lotes no volvería al archivo por lotes de llamada. Cambiar ese comportamiento sin una sintaxis adicional habría roto muchos sistemas como los sistemas de menús por lotes (usando archivos por lotes para estructuras de menús).
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 de proceso por lotes, también puede usar para hacer esto (no garantiza el orden correcto de las llamadas de archivo de proceso 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 la 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 a 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 lo señalaron: eche un vistazo a los sistemas de compilación para reemplazar archivos por lotes.
Tratar:
call msbuild.bat
call unit-tests.bat
call deploy.bat
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 comienza a ejecutarse. Es un comportamiento peculiar que se remonta a los primeros días de MS-DOS.
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat
Si eso no funciona, reemplace start
por call
o intente esto:
Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
call msbuild.bat
call unit-tests.bat
call deploy.bat