write simple script run how example create commands batch bat batch-file cmd

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