Estoy tratando de commit-build.bat
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 de la lista ( msbuild.bat
).
He ejecutado cada uno de los archivos por separado sin problemas.
batch-file
cmd
Yvette
fuente
fuente
Respuestas:
Utilizar:
Cuando no 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.
fuente
Todas las otras respuestas son correctas: use call. Por ejemplo:
Historia
En versiones antiguas de DOS no era posible ejecutar recursivamente archivos por lotes. Luego, se introdujo el comando de llamada que llamó a otro cmd shell para ejecutar el archivo por lotes y devolvió la ejecución al cmd shell de llamada cuando finalizó.
Obviamente, en versiones posteriores ya no era necesario ningún otro cmd shell.
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ú 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:
Por cierto: si no tiene todos los nombres de los archivos por lotes, también puede usar para hacer esto (no garantiza el orden correcto de las llamadas de archivos por lotes; sigue el orden del sistema de archivos):
También puede reaccionar ante niveles de error después de una llamada. Utilizar:
devolver un nivel de error. 0 denota la ejecución correcta. En el archivo por lotes de llamada puede reaccionar usando
Úselo
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 :-(
Como otros señalaron: eche un vistazo a los sistemas de compilación para reemplazar los archivos por lotes.
fuente
errorlevel
ejemplo de comando me dio un problema en Windows 10 (en la consola cmd). Modifiqué el comando simplemente para serif errorlevel neq echo Houston We have a Problem!
. Mi proceso por lotes no tuvo problemas y se completó en su mayoría normalmente, pero en cada paso del camino donde usé este comando después de una declaración de llamada, recibí "neq fue inesperado en este momento". Pensando que pueden haber cambiado la sintaxis no igual, lo intenté!=
y también,<>
pero seguí obteniendo el mismo error "no esperado en este momento" para la nueva sintaxis. ¿Qué podría estar haciendo mal?Si deseamos abrir múltiples solicitudes de comando, entonces podríamos usar
/k
: es obligatorio lo que se ejecutará.El lanzamiento de muchas indicaciones de comando se puede hacer de la siguiente manera.
fuente
start "Window title" /wait cmd /k call something.bat
para ejecutar cosas en orden secuencial.start "Window title" /wait cmd /c something.bat
, dondecmd /c
cierra la ventana una vez terminado)Tratar:
fuente
Estás 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 al respecto.
'||' prueba un nivel de error superior a 0. De esta forma, 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.
fuente
Si tenemos dos scripts por lotes, aaa.bat y bbb.bat, y llama como a continuación
Al ejecutar el script, primero llamará a aaa.bat, esperará a que termine el hilo de aaa.bat y llamará a bbb.bat.
Pero si no desea esperar a que aaa.bat termine para llamar a bbb.bat, intente usar el comando START :
Examen:
fuente
fuente
Para llamar a un
.bat
archivo dentro de un.bat
archivo, use(Sí, esto es una tontería, tendría más sentido si pudiera llamarlo
foo.bat
, como podría hacerlo desde el símbolo del sistema, pero la forma correcta es usarlocall
).fuente
Mirando sus nombres de archivos, ¿ha considerado usar una herramienta de compilación como NAnt o Ant (la versión Java). Obtendrá mucho más control que con los archivos bat.
fuente
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 pasa a otro. Si desea abrir muchos a la vez, puede probar esto:
Y así sucesivamente o repita el inicio
cmd
"call
..." para la cantidad de archivos. Esto funciona para Windows 7 , pero no estoy seguro de otros sistemas.fuente
Si eso no funciona, reemplace
start
concall
o intente lo siguiente:fuente
¡Solo usa el
call
comando! Aquí hay un ejemplo:fuente
Con una cita correcta (esto puede ser complicado a veces):
1er arg - Título (vacío en este caso)
2do arg - / D especifica el directorio de inicio, se puede omitir si se desea el directorio de trabajo actual (como "% ~ dp0")
3er arg - comando para iniciar, "cmd.exe"
4to arg: argumentos para ordenar, con comillas duplicadas para los argumentos que contiene (así es como se escapan las comillas dentro de comillas en lote)
fuente
Al ejecutar 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.
Eliminé 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.
fuente
exit
s, reemplácelos por ellosgoto :eof
. Esto "volverá" alcall
@echo off :menu some commands goto menu
tenga en cuenta que esto ejecutará un ciclo continuo hasta que se cierre. básicamente no necesitas el::
justo:
Lo siguiente resolvió mi problema:
fuente
Puede ser que quieras esto:
Ejecute las secuencias de comandos por lotes en paralelo
Aquí se ejecutan tres archivos por lotes en ventanas de comandos separadas en estado minimizado. Si no quiere que se minimicen, elimínelos
/min
. Además, si no necesita controlarlos más tarde, puede deshacerse de los títulos. Entonces, un comando básico será-start cmd /k call systemLogCollector.bat
Si quieres terminarlos-
fuente