Ejecutar múltiples comandos desde un script de cmd de Windows

136

Estoy tratando de escribir un script de cmd de Windows para realizar varias tareas en serie. Sin embargo, siempre se detiene después del primer comando en el script.

El comando que detiene después es una construcción maven (no estoy seguro de si eso es relevante).

¿Cómo hago que continúe y ejecute cada tarea por turno, por favor?

La instalación de cualquier software o la configuración del registro, etc., está completamente fuera de cuestión: me temo que tiene que funcionar en una instalación de Windows XP estándar.

Idealmente, me gustaría que el script se cancelara si alguno de los comandos fallara, pero eso es "bueno", no esencial.

Gracias.

Grebas de Darren
fuente

Respuestas:

139

Cuando llamas a otro archivo .bat, creo que necesitas "llamar" delante de la llamada:

call otherCommand.bat
Lou Franco
fuente
1
Hola, en el script original no estaba llamando a otros archivos .cmd, pero desde entonces lo he dividido en archivos separados para poder ejecutar cada uno a su vez. Entonces, poner la llamada delante de cada comando parece haber hecho el truco, ¡gracias!
Darren Greaves
55
De hecho, en Windows, mvnes un archivo .bat en sí mismo, por lo que debe usarlo callcomo en call mvn install; normalmente no necesita crear un archivo cmd adicional.
jfpoilpret
2
Tenga en cuenta que no necesita punto y coma en los archivos por lotes. Y la razón por la que necesita usar call es que mvn en sí mismo es un archivo por lotes y los archivos por lotes deben llamarse entre sí con call, de lo contrario, el control no vuelve a la persona que llama.
Pushkar
@Gulzar Nazim: ¿sabe si puedo poner todos los comandos en un solo archivo por lotes con la declaración if-else ya que no quiero mantenerlo en diferentes archivos por lotes?
Ng2-Fun
1
Estaba tratando de hacer algo similar con npmactualizaciones y protractorpruebas. No pensé que esta respuesta se aplicara a mí hasta que me di cuenta npmy protractorson .cmdarchivos en Windows.
joshden
45

Puede usar el símbolo && entre comandos para ejecutar el segundo comando solo si el primero tiene éxito. Más información aquí http://commandwindows.com/command1.htm

Steve
fuente
Gracias, lo intentaré junto con la respuesta aceptada arriba.
Darren Greaves
¿Esto detendrá la ejecución del segundo script si falla la construcción de Maven?
Varun Achar
Ese enlace está roto: "El servidor de fondo no respondió a tiempo. El servidor de aplicaciones está demasiado ocupado y no puede manejar las solicitudes a tiempo".
kevinji
1
@TheM Windows distingue entre aplicaciones basadas en GUI y basadas en comandos (hay un indicador cerca del comienzo del archivo EXE). Si inicia una aplicación basada en GUI desde la línea de comando, parece que siempre finaliza inmediatamente ya que está completamente separada de la línea de comando. Si inicia un programa basado en comandos desde un programa GUI (como Explorer), siempre mostrará una nueva línea de comando. Los sistemas POSIX no hacen tal distinción, por lo que el comportamiento es más consistente.
coderforlife
2
@TheM Para evitar esto, puedes usarstart /B /WAIT calc
coderforlife
25

No estoy seguro de por qué se detiene el primer comando. Si puede hacerlo paralelo, puede intentar algo como

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat
Gulzar Nazim
fuente
77
Use en /Klugar de /Csi desea que el shell permanezca abierto después de que se haya ejecutado su comando.
JellicleCat
No es necesario usar cmd.exey start, solo start x.bat1lo hará.
user66001
23

Acabo de hacer exactamente la misma tarea (ish) de crear un script por lotes para ejecutar scripts de prueba de Maven. El problema es que llamar a scripts maven con mvn clean install ... es en sí mismo un script y, por lo tanto, debe hacerse con call mvn clean install.

Código que funcionará

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1

Tenga en cuenta más bien el uso de la llamada. Esto permitirá el uso de scripts maven consecutivos en el archivo por lotes.

mhollander38
fuente
5

El uso de símbolos dobles ejecutará el segundo comando, solo si el primero tiene éxito:

cd Desktop/project-directory && atom .

Donde como, usando solo un ampersand intentará ejecutar ambos comandos, incluso si el primero falla:

cd Desktop/project-directory & atom .
JSON C11
fuente
1

Si está ejecutando en Windows, puede usar el siguiente comando.

Manejar:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit
Pulendar Vadde
fuente
1

No sé la respuesta directa a tu pregunta, pero si haces muchos de estos scripts, puede valer la pena aprender un lenguaje más poderoso como perl. Existen implementaciones gratuitas para Windows (por ejemplo, activestate, cygwin). He encontrado que vale la pena el esfuerzo inicial para mis propias tareas.

Editar:

Según lo sugerido por @Ferruccio, si no puede instalar software adicional, considere vbscript y / o javascript. Están integrados en el host de secuencias de comandos de Windows.

Señor fooz
fuente
Gracias pero no puedo instalar ningún software. Desearía tener acceso a algo más poderoso que el lenguaje de script de Windows. :-(
Darren Greaves
66
Siempre puedes usar vbscript o javascript. Están integrados en el host de secuencias de comandos de Windows.
Ferruccio
0

Tenga en cuenta que no necesita punto y coma en los archivos por lotes. Y la razón por la que necesita usar call es que mvn en sí mismo es un archivo por lotes y los archivos por lotes deben llamarse entre sí con call, de lo contrario, el control no vuelve a la persona que llama.

Pushkar
fuente