Warum wird nur die erste Zeile dieser Windows-Batchdatei ausgeführt, aber alle drei Zeilen werden in einer Befehlsshell ausgeführt?

171

Ich habe eine Batch-Datei, die drei Maven-Befehle nacheinander ausführt. Jeder Befehl kann erfolgreich im Skript ausgeführt werden - für sich!. Wenn ich jedoch alle drei Befehle zur gleichen Datei hinzufüge, wird nur der erste ausgeführt, bevor das Skript beendet wird. Irgendeine Idee warum?

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

Wenn ich alle drei Befehle kopiere und in eine Befehlsshell (cmd.exe) einfüge, werden sie problemlos nacheinander ausgeführt. Dies ist also anscheinend ein Problem mit der Dos-Batch-Datei.

Wiki
quelle
2
Was für eine coincedent: ich hier mit dem gleichen Problem kam und auch die gleichen Befehle in meiner Batch - Datei - mehrere Zeilen „MVN installieren: install-Datei“ :-D
Fischgräte
Mögliches Duplikat von So führen Sie mehrere .BAT-Dateien in einer .BAT-Datei aus
Peter Mortensen
1
@fishbone und zufällig haben Sie und OP beide 1.3k Ruf ..
p_champ

Antworten:

297

Maven verwendet Batch-Dateien, um seine Geschäfte zu erledigen. Bei jedem Batch-Skript müssen Sie mit dem callBefehl ein anderes Skript aufrufen, damit es nach Abschluss des aufgerufenen Skripts zu Ihrem Skript zurückkehren kann. Versuchen Sie call, allen Befehlen ein Präfix voranzustellen .

Sie können auch versuchen, den startBefehl zu verwenden, der ähnlich funktionieren sollte.

Jeff Mercado
quelle
1
Ich habe schon einmal antWindows-Batch-Dateien eingefügt und das callwar erforderlich, um antausgeführt zu werden. Ohne callden Stapel wird nach dem ersten Befehl gestoppt, daher werden die zweiten beiden nicht ausgeführt. microsoft.com/resources/documentation/windows/xp/all/proddocs/… für weitere Informationen übercall
Owen
22
startwird ein neues Fenster erzeugen und jeder der drei Befehle wird parallel ausgeführt. Wenn Sie sie synchron ausführen möchten, verwenden Sie call.
Akf
11
Wie um alles in der Welt ist es sinnvoll, dass sich eine Skriptumgebung so verhält? Wenn ich ein Skript mit zwei Befehlen geschrieben habe, erwarte ich, dass die Befehle ausgeführt werden. Ich erwarte nicht, dass die Umgebung einfach beschließt, die Ausführung meines Skripts zu beenden, nur weil einer dieser Befehle zufällig als Skript selbst implementiert ist.
Bames53
3
@ bames53: Dies ist eine Einschränkung, die von DOS herrührt und in moderne Implementierungen der Eingabeaufforderung in Windows übernommen wurde. Da Microsoft die Abwärtskompatibilität beibehalten wollte, ist dies das Ergebnis.
Jeff Mercado
2
hinzufügen call pauseam Ende (ohne Anführungszeichen) , wenn Sie die cmd Fenster offen halten wollen
JinSnow
28

Mit callhilft. Heute jedoch nicht.

So habe ich es gelöst:

Bat-Dateiinhalt (wenn Sie den Batch stoppen möchten, wenn einer der cmds-Fehler auftritt)

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

Bat-Dateiinhalt (wenn Sie den Batch fortsetzen möchten, wenn einer der cmds-Fehler auftritt)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
quelle
(Das erste Beispiel hier entspricht im cmd1 && cmd2 && cmd3 && cmd4Wesentlichen, alle Befehle in einer Zeile zu machen.)
Ben Gotow
2
Wahr. Ich habe es so geschrieben, weil es sich um eine Bat-Datei handelt. Meistens haben Sie mehrere, möglicherweise lange Befehle. 4 Befehle in einer Zeile sind für die zukünftige Wartung nicht gut. Lesbarkeit ist der Schlüssel zum Schreiben guter Programme und daher befinden sie sich in unterschiedlichen Zeilen.
Manohar Reddy Poreddy
1
Diese Lösung hat den Trick für mich getan. Die callLösung hörte nicht bei Fehlern auf, das tut sie.
Tim
9

Um mehr Maven-Builds von einem Skript aus auszuführen, müssen Sie die Windows- Aufruffunktion folgendermaßen verwenden:

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
quelle
1

Es sollte sein, dass der bestimmte mvnBefehl execs und nicht zurückkehrt, wodurch der Rest der Befehle nicht ausgeführt wird.

Alan Haggai Alavi
quelle
Gibt es eine Möglichkeit, das Skript zu zwingen, den nächsten mvnBefehl auszuführen ?
Wiki
1

Versuchen Sie, die folgende Batch-Datei zu schreiben und auszuführen:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Nur die ersten beiden Zeilen werden ausgeführt. Wenn Sie jedoch an der Eingabeaufforderung "exit" eingeben, werden die nächsten beiden Zeilen verarbeitet. Es ist eine Shell, die eine andere lädt.

Um sicherzugehen, dass dies in Ihrem Skript nicht der Fall ist, geben Sie einfach "exit" ein, wenn der erste Befehl endet.

HTH!

Dr. Belisarius
quelle
Unwahrscheinlich; Maven verwendet in der Tat eine Batch-Datei, weshalb sie verwendet werden müssen call. Es ist keine verschachtelte Shell, die nicht beendet wird.
Joey