Pourquoi seule la première ligne de ce fichier de commandes Windows s'exécute mais les trois lignes s'exécutent dans un shell de commande?

171

J'ai un fichier batch qui exécute trois commandes Maven, l'une après l'autre. Chaque commande peut être exécutée avec succès dans le script - par elle-même !. Mais lorsque j'ajoute les trois commandes au même fichier, seule la première s'exécute avant la fin du script. Une idée pourquoi?

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

De plus, si je copie les trois commandes et les colle dans un shell de commande (cmd.exe), elles s'exécutent l'une après l'autre sans problème. C'est donc apparemment un problème avec le fichier de commandes dos.

wiki
la source
2
Quel coincedent: je suis venu ici avec le même problème et aussi les mêmes commandes dans mon fichier batch - plusieurs lignes de "mvn install: install-file" :-D
fishbone
1
@fishbone et par coïncidence vous et OP avez tous les deux une réputation de 1,3k ..
p_champ

Réponses:

298

Maven utilise des fichiers batch pour faire ses affaires. Avec n'importe quel script batch, vous devez appeler un autre script à l'aide de la callcommande afin qu'il sache revenir à votre script une fois le script appelé terminé. Essayez de faire précéder calltoutes les commandes.

Une autre chose que vous pouvez essayer est d'utiliser la startcommande qui devrait fonctionner de la même manière.

Jeff Mercado
la source
1
J'ai mis à l' antintérieur des fichiers batch Windows avant et le callétait nécessaire pour pouvoir ants'exécuter. Sans callle lot s'arrêtera après la première commande, donc les deux secondes ne s'exécutent pas. microsoft.com/resources/documentation/windows/xp/all/proddocs/… pour plus d'informations surcall
Owen
22
startprovoquera l'apparition d'une nouvelle fenêtre et chacune des trois commandes s'exécutera en parallèle. Si vous en avez besoin pour s'exécuter de manière synchrone, utilisez call.
akf
11
Comment diable est-il logique qu'un environnement de script se comporte de cette façon? Si j'ai écrit un script avec deux commandes, je m'attends à ce que les commandes soient exécutées; Je ne m'attends pas à ce que l'environnement décide simplement d'arrêter d'exécuter mon script simplement parce qu'une de ces commandes se trouve être implémentée en tant que script lui-même.
bames53
3
@ bames53: il s'agit d'une limitation provenant de DOS qui a été transférée dans les implémentations modernes de l'invite de commande sous Windows. Puisque les objectifs de Microsoft étaient de maintenir la compatibilité descendante, c'est le résultat.
Jeff Mercado
2
ajouter call pauseà la fin (sans guillemets) si vous voulez garder les fenêtres cmd ouvertes
JinSnow
28

Avoir des callaides. Mais aujourd'hui, non.

Voici comment je l'ai résolu:

Contenu du fichier Bat (si vous souhaitez arrêter le lot lorsque l'une des erreurs cmds)

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

Contenu du fichier Bat (si vous souhaitez continuer le lot lorsque l'une des erreurs cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
la source
(Le premier exemple ici équivaut à cmd1 && cmd2 && cmd3 && cmd4créer essentiellement toutes les commandes sur une seule ligne.)
Ben Gotow
2
Vrai. Je l'ai écrit de cette façon parce qu'il s'agit d'un fichier chauve-souris, la plupart du temps, vous aurez plusieurs commandes, éventuellement longues, 4 commandes dans une ligne ne seront pas bonnes pour la maintenance future. La lisibilité est la clé de la rédaction de bons programmes et ils sont donc sur des lignes différentes.
Manohar Reddy Poreddy
1
Cette solution a fait l'affaire pour moi. La callsolution ne s'arrêtait pas aux erreurs, celle-ci le fait.
Tim
9

Pour exécuter plus de builds Maven à partir d'un script, vous devez utiliser la fonction d' appel Windows de la manière suivante:

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
la source
1

Il devrait être que la mvncommande particulière execs et ne retourne pas, n'exécutant ainsi pas le reste des commandes.

Alan Haggai Alavi
la source
Existe-t-il un moyen de forcer le script à exécuter la mvncommande suivante ?
wiki
1

Essayez d'écrire le fichier de commandes suivant et de l'exécuter:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Seules les deux premières lignes sont exécutées. Mais si vous tapez "exit" à l'invite de commande, les deux lignes suivantes sont traitées. C'est un shell qui en charge un autre.

Pour être sûr que ce n'est pas ce qui se passe dans votre script, tapez simplement "exit" lorsque la première commande se termine.

HTH!

Dr Bélisarius
la source
Improbable; Maven utilise en effet un fichier batch, c'est pourquoi ils doivent l'utiliser call. Ce n'est pas un shell imbriqué qui n'est pas terminé.
Joey