Wykonywanie wielu poleceń ze skryptu cmd systemu Windows

136

Próbuję napisać skrypt cmd systemu Windows, aby wykonać szereg zadań. Jednak zawsze zatrzymuje się po pierwszym poleceniu w skrypcie.

Polecenie, po którym się zatrzymuje, to kompilacja mavena (nie jestem pewien, czy jest to istotne).

Jak mam to zrobić i uruchomić po kolei każde zadanie?

Instalowanie jakiegokolwiek oprogramowania, konfigurowanie rejestru itp. Jest całkowicie wykluczone - obawiam się, że musi działać na zwykłej instalacji systemu Windows XP.

Idealnie chciałbym, aby skrypt przerywał działanie, jeśli którekolwiek z poleceń zawiodło, ale jest to „przyjemne mieć”, a nie niezbędne.

Dzięki.

Darren Greaves
źródło

Odpowiedzi:

139

Kiedy dzwonisz do innego pliku .bat, myślę, że przed wywołaniem potrzebujesz „call”:

call otherCommand.bat
Lou Franco
źródło
1
Cześć, w oryginalnym skrypcie nie wywoływałem innych plików .cmd, ale od tego czasu podzieliłem go na osobne pliki, aby móc uruchamiać każdy po kolei. Wydaje się, że umieszczenie połączenia przed każdym poleceniem załatwiło sprawę, dzięki!
Darren Greaves
5
W rzeczywistości w systemie Windows sam mvnjest plikiem .bat, dlatego należy go używać calltak, jak w call mvn install; normalnie nie ma potrzeby tworzenia dodatkowego pliku cmd.
jfpoilpret
2
Pamiętaj, że nie potrzebujesz średników w plikach wsadowych. Powodem, dla którego musisz użyć wywołania, jest to, że sam mvn jest plikiem wsadowym, a pliki wsadowe muszą wywoływać się nawzajem za pomocą wywołania, w przeciwnym razie sterowanie nie wróci do dzwoniącego.
Pushkar,
@Gulzar Nazim - Czy wiesz, czy mogę umieścić wszystkie polecenia w jednym pliku wsadowym z instrukcją if-else, ponieważ nie chcę przechowywać go w różnych plikach wsadowych?
Ng2-Fun
1
Próbowałem zrobić coś podobnego z npmaktualizacjami i protractortestami. Nie sądziłem, że to odpowiedź zastosowany do mnie, aż zdałem sobie sprawę, npmi protractor.cmdpliki w systemie Windows.
joshden
45

Możesz użyć symbolu && między poleceniami, aby wykonać drugie polecenie tylko wtedy, gdy pierwsze powiedzie się. Więcej informacji tutaj http://commandwindows.com/command1.htm

Steve
źródło
Dzięki, spróbuję w połączeniu z zaakceptowaną odpowiedzią powyżej.
Darren Greaves
Czy zatrzyma to wykonanie drugiego skryptu, jeśli kompilacja maven się nie powiedzie?
Varun Achar
To łącze jest uszkodzone: „Serwer zaplecza nie odpowiedział na czas. Serwer aplikacji jest zbyt zajęty i nie może obsługiwać żądań na czas”.
kevinji,
1
@TheM Windows rozróżnia aplikacje oparte na graficznym interfejsie użytkownika i oparte na poleceniach (w pobliżu początku pliku EXE znajduje się flaga). Jeśli uruchamiasz aplikację opartą na graficznym interfejsie użytkownika z wiersza poleceń, zawsze wydaje się, że kończy się natychmiast, ponieważ jest całkowicie odłączona od wiersza poleceń. Jeśli uruchomisz program oparty na poleceniach z programu GUI (takiego jak Explorer), zawsze wyświetli się nowy wiersz poleceń. Systemy POSIX nie dokonują takiego rozróżnienia, więc zachowanie jest bardziej spójne.
coderforlife
2
@TheM Aby obejść ten problem, możesz użyćstart /B /WAIT calc
coderforlife
25

Nie wiem, dlaczego pierwsze polecenie się zatrzymuje. Jeśli możesz to zrobić równolegle, możesz spróbować czegoś takiego

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat
Gulzar Nazim
źródło
7
Użyj /Kzamiast, /Cjeśli chcesz, aby powłoka pozostała otwarta po wykonaniu polecenia.
JellicleCat
Nie ma potrzeby używania cmd.exei start, po prostu start x.bat1zrobi.
user66001
23

Właśnie wykonałem dokładnie to samo (ish) zadanie tworzenia skryptu wsadowego do uruchamiania skryptów testowych maven. Problem polega na tym, że wywołanie maven scrips z mvn clean install ... samo w sobie jest skryptem i dlatego należy je wykonać za pomocą wywołania mvn clean install.

Kod, który zadziała

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1

Zwróć uwagę raczej na użycie połączenia. Pozwoli to na użycie kolejnych skryptów Maven w pliku wsadowym.

mhollander38
źródło
5

Użycie podwójnych ampersandów uruchomi drugie polecenie, tylko jeśli pierwsze się powiedzie:

cd Desktop/project-directory && atom .

Jeśli tak, użycie tylko jednego znaku ampersand spowoduje próbę uruchomienia obu poleceń, nawet jeśli pierwsze się nie powiedzie:

cd Desktop/project-directory & atom .
JSON C11
źródło
1

Jeśli pracujesz w systemie Windows, możesz użyć następującego polecenia.

Napęd:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit
Pulendar Vadde
źródło
1

Nie znam bezpośredniej odpowiedzi na twoje pytanie, ale jeśli robisz wiele z tych skryptów, może warto nauczyć się potężniejszego języka, takiego jak perl. Istnieją bezpłatne implementacje dla systemu Windows (np. Activestate, cygwin). Uważam, że jest to warte początkowego wysiłku dla moich własnych zadań.

Edytować:

Zgodnie z sugestią @Ferruccio, jeśli nie możesz zainstalować dodatkowego oprogramowania, rozważ vbscript i / lub javascript. Są wbudowane w hosta skryptów systemu Windows.

Panie Fooz
źródło
Dzięki, ale nie mogę zainstalować żadnego oprogramowania. Żałuję, że nie mam dostępu do czegoś potężniejszego niż kiepski język skryptowy Windows. :-(
Darren Greaves
6
Zawsze możesz użyć vbscript lub javascript. Są wbudowane w hosta skryptów systemu Windows.
Ferruccio
0

Pamiętaj, że nie potrzebujesz średników w plikach wsadowych. Powodem, dla którego musisz użyć wywołania, jest to, że sam mvn jest plikiem wsadowym, a pliki wsadowe muszą wywoływać się nawzajem za pomocą wywołania, w przeciwnym razie sterowanie nie wróci do dzwoniącego.

Pushkar
źródło