Dlaczego tylko pierwsza linia tego pliku wsadowego systemu Windows jest wykonywana, a wszystkie trzy wiersze są wykonywane w powłoce poleceń?

171

Mam plik wsadowy, który wykonuje trzy polecenia Mavena, jedno po drugim. Każde polecenie można pomyślnie wykonać w skrypcie - samodzielnie !. Ale kiedy dodam wszystkie trzy polecenia do tego samego pliku, tylko pierwsza jest wykonywana przed zakończeniem działania skryptu. Masz jakiś pomysł, dlaczego?

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

Ponadto, jeśli skopiuję wszystkie trzy polecenia i wkleię je do powłoki poleceń (cmd.exe), będą one wykonywane jedno po drugim bez problemu. Jest to najwyraźniej jakiś problem z plikiem wsadowym DOS.

wiki
źródło
2
Co za zbieg okoliczności: przyszedłem tutaj z tym samym problemem i tymi samymi poleceniami w moim pliku wsadowym - wiele wierszy polecenia „mvn install: install-file” :-D
fishbone
Możliwy duplikat Jak uruchomić wiele plików .BAT w pliku .BAT
Peter Mortensen
1
@fishbone i przypadkowo zarówno ty, jak i OP macie reputację 1,3 tys.
p_champ

Odpowiedzi:

297

Maven używa plików wsadowych do prowadzenia swojej działalności. W przypadku każdego skryptu wsadowego należy wywołać inny skrypt za pomocą callpolecenia, aby wiedział, że ma wrócić do skryptu po zakończeniu wykonywania wywoływanego skryptu. Spróbuj poprzedzić callwszystkie polecenia.

Inną rzeczą, którą możesz spróbować, jest użycie startpolecenia, które powinno działać podobnie.

Jeff Mercado
źródło
1
Umieściłem już antwcześniej pliki wsadowe systemu Windows i callbyło to wymagane antdo wykonania. Bez callwsadu zatrzyma się po pierwszym poleceniu, stąd drugie dwa nie będą wykonywane. microsoft.com/resources/documentation/windows/xp/all/proddocs/ ... aby uzyskać więcej informacji na tematcall
Owen
22
startspowoduje pojawienie się nowego okna, a każde z trzech poleceń będzie działać równolegle. Jeśli chcesz, aby działały synchronicznie, użyj call.
akf
11
Jaki sens ma zachowanie środowiska skryptowego w taki sposób? Jeśli napisałem skrypt z dwoma poleceniami, oczekuję, że polecenia zostaną wykonane; Nie oczekuję, że środowisko po prostu zdecyduje się przestać wykonywać mój skrypt tylko dlatego, że jedno z tych poleceń jest zaimplementowane jako sam skrypt.
bames53
3
@ bames53: jest to ograniczenie, które pochodzi z DOS i zostało przeniesione do nowoczesnych implementacji wiersza poleceń w systemie Windows. Oto rezultat, ponieważ celem Microsoftu było zachowanie wstecznej kompatybilności.
Jeff Mercado,
2
dodaj call pausena końcu (bez cudzysłowów), jeśli chcesz pozostawić otwarte okna cmd
JinSnow
28

Posiadanie callpomocy. Jednak dzisiaj tak się nie stało.

Oto jak to rozwiązałem:

Zawartość pliku bat (jeśli chcesz zatrzymać wsad, gdy wystąpi jeden z błędów cmds)

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

Zawartość pliku bat (jeśli chcesz kontynuować wsad po jednym z błędów cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
źródło
(Pierwszy przykład tutaj jest równoważny z cmd1 && cmd2 && cmd3 && cmd4, zasadniczo czyniąc wszystkie polecenia jedną linią.)
Ben Gotow
2
Prawdziwe. Napisałem to w ten sposób, ponieważ jest to plik bat, w większości przypadków będziesz mieć wiele, prawdopodobnie długich poleceń, 4 polecenia w jednej linii nie będą dobre w przyszłej konserwacji. Czytelność jest kluczem do pisania dobrych programów, dlatego są one podzielone na różne tematy.
Manohar Reddy Poreddy,
1
To rozwiązanie załatwiło sprawę dla mnie. callRozwiązanie nie zatrzymując się na błędach, to się robi.
Tim
9

Aby wykonać więcej kompilacji Mavena z jednego skryptu, użyj funkcji wywołania systemu Windows w następujący sposób:

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
źródło
1

Powinno być tak, że określone mvnpolecenie execs i nie zwraca, tym samym nie wykonując pozostałych poleceń.

Alan Haggai Alavi
źródło
Czy istnieje sposób, aby zmusić skrypt do wykonania następnej mvnkomendy?
wiki
1

Spróbuj napisać następujący plik wsadowy i go wykonać:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Wykonywane są tylko pierwsze dwie linie. Ale jeśli wpiszesz „exit” w wierszu polecenia, przetworzone zostaną następne dwa wiersze. To pocisk ładujący inny.

Aby mieć pewność, że to nie jest to, co dzieje się w twoim skrypcie, po prostu wpisz "exit" po zakończeniu pierwszego polecenia.

HTH!

Dr Belisarius
źródło
Mało prawdopodobne; Maven rzeczywiście używa pliku wsadowego, dlatego muszą go używać call. To nie jest zagnieżdżona powłoka, która nie jest zakończona.
Joey