¿Por qué solo se ejecuta la primera línea de este archivo por lotes de Windows, pero las tres líneas se ejecutan en un shell de comandos?

171

Tengo un archivo por lotes que ejecuta tres comandos de Maven, uno tras otro. Cada comando se puede ejecutar con éxito en el script, ¡solo! Pero cuando agrego los tres comandos al mismo archivo, solo el primero se ejecuta antes de que salga el script. ¿Alguna idea de por qué?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

Además, si copio los tres comandos y los pego en un shell de comandos (cmd.exe), se ejecutan uno tras otro sin ningún problema. Aparentemente, esto es un problema con el archivo de dos lotes.

wiki
fuente
2
Qué coincedente: Vine aquí con el mismo problema y también los mismos comandos en mi archivo por lotes: varias líneas de "mvn install: install-file" :-D
fishbone
1
@fishbone y, al mismo tiempo, OP y OP tienen una reputación de 1.3k ...
p_champ

Respuestas:

297

Maven utiliza archivos por lotes para hacer sus negocios. Con cualquier secuencia de comandos por lotes, debe llamar a otra secuencia de comandos utilizando el callcomando para que sepa volver a su secuencia de comandos después de que se complete la secuencia de comandos llamada. Intenta anteponer calltodos los comandos.

Otra cosa que puedes probar es usar el startcomando que debería funcionar de manera similar.

Jeff Mercado
fuente
1
Puse antdentro de los archivos por lotes de Windows antes y callfue necesario antpara ejecutar. Sin callel lote se detendrá después del primer comando, por lo tanto, los dos segundos no se ejecutan. microsoft.com/resources/documentation/windows/xp/all/proddocs/… para obtener más información sobrecall
Owen
22
starthará que aparezca una nueva ventana, y cada uno de los tres comandos se ejecutará en paralelo. Si necesita que se ejecuten sincrónicamente, use call.
akf
11
¿Cómo tiene sentido que un entorno de secuencias de comandos se comporte de esta manera? Si he escrito un script con dos comandos, espero que se ejecuten los comandos; No espero que el entorno simplemente decida dejar de ejecutar mi script simplemente porque uno de esos comandos se implementa como un script en sí mismo.
bames53
3
@ bames53: esta es una limitación que se originó en DOS que se trasladó a implementaciones modernas del símbolo del sistema en Windows. Dado que los objetivos de Microsoft eran mantener la compatibilidad con versiones anteriores, este es el resultado.
Jeff Mercado
2
agregue call pauseal final (sin comillas) si desea mantener abiertas las ventanas de cmd
JinSnow
28

Tener callayuda Sin embargo hoy no lo hizo.

Así es como lo resolví:

Contenido del archivo bat (si desea detener el lote cuando se produce un error de cmds)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

Contenido del archivo bat (si desea continuar por lotes cuando se produce un error de cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
fuente
(El primer ejemplo aquí es equivalente a cmd1 && cmd2 && cmd3 && cmd4, esencialmente, hacer que todos los comandos sean una línea.)
Ben Gotow
2
Cierto. Lo escribí de esa manera porque es un archivo bat, en su mayoría tendrá múltiples comandos, posiblemente largos, 4 comandos en una línea no serán buenos en el mantenimiento futuro. La legibilidad es clave para escribir buenos programas y, por lo tanto, están en diferentes líneas.
Manohar Reddy Poreddy
1
Esta solución hizo el truco para mí. La callsolución no era detenerse ante los errores, este sí.
Tim
9

Para ejecutar más compilaciones de Maven a partir de un script, deberá utilizar la función de llamada de Windows de la siguiente manera:

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true
Seweryn Habdank-Wojewódzki
fuente
1

Debería ser que el mvncomando en particular execno retorna, por lo tanto no ejecuta el resto de los comandos.

Alan Haggai Alavi
fuente
¿Hay alguna forma de obligar al script a ejecutar el siguiente mvncomando?
wiki
1

Intente escribir el siguiente archivo por lotes y ejecutarlo:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Solo se ejecutan las dos primeras líneas. Pero si escribe "salir" en el símbolo del sistema, se procesan las dos líneas siguientes. Es un caparazón cargando otro.

Para estar seguro de que esto no es lo que está sucediendo en su script, simplemente escriba "exit" cuando finalice el primer comando.

HTH!

Dr. belisario
fuente
Improbable; De hecho, Maven usa un archivo por lotes, por lo que deben usarlo call. No es un shell anidado que no está terminado.
Joey