Próbuję zmusić mnie commit-build.bat
do wykonania innych plików .BAT w ramach naszego procesu kompilacji.
Treść commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
Wydaje się to dość proste, ale commit-build.bat
wykonuje tylko pierwszy element na liście ( msbuild.bat
).
Uruchomiłem każdy z plików osobno, bez żadnych problemów.
batch-file
cmd
Yvette
źródło
źródło
Odpowiedzi:
Posługiwać się:
Gdy nie jest używane CALL, bieżący plik wsadowy zatrzymuje się, a wywoływany plik wsadowy rozpoczyna wykonywanie. Jest to szczególne zachowanie sięgające wczesnych dni MS-DOS.
źródło
Wszystkie pozostałe odpowiedzi są poprawne: użyj połączenia. Na przykład:
Historia
W starożytnych wersjach DOS rekurencyjne wykonywanie plików wsadowych było niemożliwe. Następnie wprowadzono polecenie call, które wywołało kolejną powłokę cmd w celu wykonania pliku wsadowego i po zakończeniu zwróciło wykonanie z powrotem do wywołującej powłoki cmd.
Oczywiście w późniejszych wersjach żadna inna powłoka cmd nie była już potrzebna.
Na początku wiele plików wsadowych zależało od tego, że wywołanie pliku wsadowego nie powróci do wywoływanego pliku wsadowego. Zmiana tego zachowania bez dodatkowej składni spowodowałaby uszkodzenie wielu systemów, takich jak systemy menu wsadowego (używanie plików wsadowych do struktur menu).
Dlatego, podobnie jak w wielu przypadkach z Microsoftem, zgodność z poprzednimi wersjami jest przyczyną tego zachowania.
Porady
Jeśli pliki wsadowe mają spacje w nazwach, użyj cudzysłowów wokół nazwy:
Nawiasem mówiąc: jeśli nie masz wszystkich nazw plików wsadowych, możesz również użyć do tego (nie gwarantuje to prawidłowej kolejności wywołań plików wsadowych; postępuje zgodnie z kolejnością systemu plików):
Możesz także reagować na poziomy błędu po połączeniu. Posługiwać się:
zwrócić poziom błędu. 0 oznacza prawidłowe wykonanie. W wywoływanym pliku wsadowym możesz zareagować za pomocą
Użyj,
if errorlevel 1
jeśli masz starszy system Windows niż NT4 / 2000 / XP, aby wyłapać wszystkie poziomy błędu 1 i wyższe.Aby kontrolować przepływ pliku wsadowego, jest goto :-(
Jak zauważyli inni: spójrz na systemy kompilacji zastępujące pliki wsadowe.
źródło
errorlevel
przykład polecenie dał mi problem w Windows 10 (w konsoli cmd). Po prostu zmodyfikowałem polecenieif errorlevel neq echo Houston We have a Problem!
. Mój proces wsadowy nie miał problemów i zakończył się w większości normalnie, ale na każdym kroku, w którym użyłem tego polecenia po instrukcji call, otrzymałem „neq było w tej chwili nieoczekiwane”. Myśląc, że może nie zmieniły równy składni, próbowałem!=
, a także<>
, ale ciągle się ten sam „nie oczekuje w tej chwili” błąd dla nowej składni. co mogłem robić źle?Jeśli chcemy otworzyć wiele podpowiedzi poleceń, moglibyśmy użyć
/k
: jest obowiązkowy, który zostanie wykonany.Uruchamianie wielu wierszy poleceń można wykonać jak poniżej.
źródło
start "Window title" /wait cmd /k call something.bat
do uruchamiania rzeczy w kolejności sekwencyjnej.start "Window title" /wait cmd /c something.bat
, gdziecmd /c
zamyka okno po zakończeniu)Próbować:
źródło
Wywołujesz wiele partii w celu skompilowania programu. Przyjmuję za pewnik, że jeśli wystąpi błąd:
1) Program w pakiecie zakończy działanie z poziomem błędu ;
2) Chcesz się o tym dowiedzieć.
„||” sprawdza poziom błędu wyższy niż 0. W ten sposób wszystkie partie są wywoływane w kolejności, ale zatrzymają się przy każdym błędzie, pozostawiając ekran bez zmian.
źródło
Jeśli mamy dwa skrypty wsadowe, aaa.bat i bbb.bat, i wywołujemy jak poniżej
Podczas wykonywania skryptu najpierw wywoła aaa.bat, zaczeka na zakończenie wątku aaa.bat i wywoła bbb.bat.
Ale jeśli nie chcesz czekać na zakończenie aaa.bat w celu wywołania bbb.bat, spróbuj użyć polecenia START :
Egzamin:
źródło
źródło
Aby wywołać
.bat
plik w.bat
pliku, użyj(Tak, to głupie, byłoby bardziej sensowne, gdybyś mógł to wywołać
foo.bat
, tak jak z wiersza poleceń, ale poprawnym sposobem jest użyciecall
.)źródło
Patrząc na nazwy plików, czy zastanawiałeś się nad użyciem narzędzia do kompilacji, takiego jak NAnt lub Ant (wersja Java). Otrzymasz o wiele większą kontrolę niż w przypadku plików nietoperzy.
źródło
Jeśli chcesz otworzyć wiele plików wsadowych jednocześnie, możesz użyć polecenia call. Jednak polecenie połączenia zamyka bieżący plik nietoperza i przechodzi do innego. Jeśli chcesz otworzyć wiele jednocześnie, możesz spróbować:
I tak dalej lub powtórz start
cmd
„call
...” dla dowolnej liczby plików. Działa to w systemie Windows 7 , ale nie jestem pewien co do innych systemów.źródło
Jeśli to nie zadziała, należy wymienić
start
zcall
lub spróbuj tego:źródło
Wystarczy użyć
call
polecenia! Oto przykład:źródło
Przy prawidłowym cytowaniu (czasami może to być trudne):
1st arg - Title (w tym przypadku pusty)
2nd arg - / D określa katalog startowy, można go pominąć, jeśli chcesz, aby bieżący katalog działał (np. „% ~ Dp0”)
3. arg - polecenie uruchomienia, „cmd.exe”
4th arg - argumenty do polecenia, z podwojonymi cudzysłowami dla argumentów w środku (w ten sposób unikasz cudzysłowów w cudzysłowach wsadowo)
źródło
Uruchamiając wiele skryptów w jednym miałem ten sam problem. Utrzymywałem, że umiera na pierwszym, nie zdając sobie sprawy, że kończy się na pierwszym skrypcie.
Usunąłem wszystkie 11 wierszy EXIT skryptu i próbowałem ponownie, a wszystkie 11 działały kolejno po kolei w tym samym oknie poleceń.
źródło
exit
s,goto :eof
zamiast tego zastąp je . Będzie to "powrót" docall
@echo off :menu some commands goto menu
Pamiętaj, że będzie to ciągła pętla, dopóki nie zostanie zamknięta. w zasadzie nie potrzebujesz::
sprawiedliwego:
Następujące rozwiązanie rozwiązało mój problem:
źródło
Może chcesz tego:
Uruchom skrypty wsadowe równolegle
Tutaj trzy pliki wsadowe są uruchamiane w osobnych oknach poleceń w stanie zminimalizowanym. Jeśli nie chcesz ich minimalizować, usuń je
/min
. Ponadto, jeśli nie będziesz musiał kontrolować ich później, możesz pozbyć się tytułów. Tak więc polecenie bez kości będzie…start cmd /k call systemLogCollector.bat
Jeśli chcesz je rozwiązać-
źródło