Jak zapobiec automatycznemu zamykaniu konsoli po wykonaniu pliku wsadowego

509

Jakie polecenie mogę umieścić na końcu pliku wsadowego, aby zapobiec automatycznemu zamknięciu konsoli po wykonaniu pliku?

Joe
źródło
5
Byłoby dobrze, gdyby istniał sposób na wykrycie, czy plik .cmd został uruchomiony przez dwukrotne kliknięcie w eksploratorze (wtedy chcesz, aby zatrzymał się na końcu) lub jeśli został uruchomiony przez już otwarty wiersz poleceń. W późniejszym przypadku (a zwłaszcza jeśli jest wykonywany przez inny program) nie chcesz przerwy. Nie znalazłem dobrego rozwiązania dla tego przypadku (i zazwyczaj używam zmiennej if% NOPAUSE%, ale działa to tylko dla programów nadrzędnych, a nie dla powłok paremt).
eckes
1
Istnieje sposób: stackoverflow.com/questions/3551888/...
EM0

Odpowiedzi:

634

W plikach wsadowych Windows / DOS:

pause

To ładna "Press any key to continue . . . "wiadomość

Lub, jeśli nie chcesz "Press any key to continue . . ."wiadomości, zrób to zamiast tego:

pause >nul
Dave Bauman
źródło
14
Żadna z sugestii tutaj nie działa dla mnie po dwukrotnym kliknięciu pliku nietoperza. To środowisko serwerowe (i muszę w nim uruchomić skrypt), aby mogli zmodyfikować zachowanie. To nie zmienia mojego celu. Aby okno poleceń było otwarte, więc mogę napisać komunikat o błędzie.
Henrik Erlandsson
1
Tak, to nie zawsze działa w zależności od środowiska. Aby uzyskać bardziej niezawodne rozwiązanie, zobacz moją odpowiedź poniżej. Zasadniczo po prostu ustaw / p exitkey = "Naciśnij dowolny klawisz, aby kontynuować ..."
Steven Mark Ford
Uważaj, jeśli ktoś uruchomi Twój skrypt bez okna konsoli (na przykład przez vbscript), to zawiesi się, dopóki nie zabijesz go za pomocą Menedżera zadań.
Andry
Jeśli to coś jak maven, użyj CALL, stackoverflow.com/a/52205298/4485678
Kevin Roy
pauza działa tutaj doskonale
Davidson Lima
141

Zależy od dokładnego pytania!

Zwykle pausewykonuje to zadanie w pliku .bat .

Jeśli chcesz, aby cmd.exe nie zamykał się, aby móc pisać dalej, użyj cmd /kpolecenia na końcu pliku.

Rutger Nijlunsing
źródło
2
Jeśli uruchamiasz polecenia systemu Windows za pomocą okna dialogowego Uruchom, cmd /kzamiast tego umieść je przed poleceniem. & cmd /knie zadziała.
Noumenon
68

Jeśli chcesz, aby cmd.exe nie zamykał się i mógł kontynuować pisanie, użyj cmd /k

Po prostu poczułem potrzebę wyjaśnienia, co /krobi (ze strony Windows):

/k : Wykonuje polecenie określone przez ciąg i kontynuuje.

Więc cmd /kbez polecenia kontynuacji na końcu pliku nietoperza po prostu pozostawi cmd.exeotwarte okno do dalszego użycia.

Z drugiej strony pausena końcu pliku wsadowego po prostu wstrzyma proces i zakończy się cmd.exepo pierwszym naciśnięciu przycisku

Valentine Stone
źródło
24

Poniższy sposób posiadania poleceń w pliku wsadowym otworzy nowe okna wiersza polecenia, a nowe okna nie wyjdą automatycznie.

start "title" call abcd.exe param1 param2  
start "title" call xyz.exe param1 param2
użytkownik6928445
źródło
2
W moim przypadku wystąpił błąd podczas uruchamiania polecenia terminalu, więc polecenia „pauza” i „cmd / k” nie pomogły mi zatrzymać programu z powodu błędu. Ten przykład pomógł mi pokazać, mam błąd, a także zatrzymałem się całkiem z terminala. Dzięki!
HowDoYouTellForAChild
19

Jeśli używasz Maven i chcesz pominąć pisanie i uniemożliwić zamknięcie konsoli, aby zobaczyć wynik, musisz użyć CALLpolecenia w skrypcie, oprócz samej „czystej instalacji mvn”.

W ten sposób zamkniesz konsolę

ECHO This is the wrong exemple
mvn clean install
pause

W ten sposób konsola pozostanie otwarta

ECHO This is the right exemple
CALL mvn clean install
pause

Jeśli nie użyjesz CALLpolecenia, żadna z przeszłych przykładów nie będzie działać.

Andrey Hartung
źródło
1
Wielkie dzięki! Zapobiega zamknięciu monitu w przypadku niepowodzenia polecenia.
Timur Gilauri,
1
To zadziałało dla mnie. Chciałem wykonać 2 różne polecenia w 1 pliku nietoperza. ale mój monit został zamknięty po pierwszym poleceniu. Umieszczenie call <myCommand>rozwiązało ten problem: Mój monit przestał się zamykać po pierwszej egzekucji
Zombkey
1
Najbardziej użyteczna odpowiedź
gianmarcocalbi
14

Dodaj cmd.exejako nowy wiersz poniżej kodu, który chcesz wykonać:

c:\Python27\python D:\code\simple_http_server.py

cmd.exe
lyfing
źródło
Właśnie tego szukałem, dzięki! „Pauza” po prostu nie zadziała, gdy skrypt Pythona ulegnie awarii. Chciałem zobaczyć komunikat o błędzie. Do tej pory musiałem uruchamiać skrypty pythonowe za pośrednictwem konsoli
użytkownik70960
Ale to działa dobrze:python script.py %1 && cmd
user70960
Dziękuję Ci! To pomogło! Tworzyłem plik wsadowy do uruchamiania aplikacji w języku Python.
fez.tival
10

moim sposobem jest napisanie rzeczywistej partii (mówiąc „foo.bat”), aby zakończyć zadanie; następnie utwórz kolejny plik „start.bat”:

@echo off
cmd /k foo.bat

Uważam, że jest to niezwykle przydatne, gdy konfiguruję jednorazowe zmienne środowiskowe.

Erich Chen
źródło
1
Możesz po prostu cmd /k(bez żadnego polecenia) umieścić na końcu foo.batpliku i uruchomić go. Nie potrzebujesz osobnego start.batpliku.
ADTC
9

Wywołaj cmdna końcu pliku wsadowego.

użytkownik4155296
źródło
5

oprócz pause.

set /p=

można użyć. Oczekuje danych wejściowych od użytkownika i zwolni przepływ po naciśnięciu klawisza enter.

lub

runas /user:# "" >nul 2>&1

który zrobi to samo, chyba że nic z danych wprowadzonych przez użytkownika nie zostanie wyświetlone ani nie pozostanie w historii poleceń.

npocmaka
źródło
3

Możliwość 1: Po prostu utwórz 2 pliki .bat i napisz do pierwszego:

start <filename> // name of 2nd batch file
exit

Plik wsadowy 2 to plik, który nie zostanie zamknięty na końcu. Więc teraz, kiedy otworzysz partię nr 1, rozpocznie się druga i sama cloe. Po 2. zakończeniu nie zamknie się całkowicie (o ile nie umieścisz wyjścia na końcu)

Możliwość 2: Plik wsadowy 1:

call <filename>
cls
echo End of file
pause
<any code you want>

Kiedy drugi plik się skończy, przejdzie do pliku 1 i wyśle ​​resztę. Dzięki temu możesz nawet tworzyć programy obsługi błędów. Jeśli nr 1 ulega awarii, przechodzi w nr 2 i wyświetla go

BlazeLP
źródło
2

Ten mały hack prosi użytkownika o wpisanie klucza i zapisuje go w zmiennej% exitkey% (ta zmienna może być nazywana, co tylko zechcesz).

set /p exitkey= "Press any key to continue..."

Uwaga: spacja po „=” jest bardzo ważna

Steven Mark Ford
źródło
2
pause

lub

echo text to display
pause>nul
Zenedus
źródło
2

Wiem, że się spóźniam, ale moim ulubionym sposobem jest:

:programend
pause>nul
GOTO programend

W ten sposób użytkownik nie może wyjść za pomocą enter.

decadenza
źródło
Myślę, że tak, ponieważ jest to ulepszony sposób zapobiegania zamykaniu się konsoli. Nawet jeśli użytkownik naciśnie klawisz, konsola pozostaje otwarta. Użytkownik będzie zmuszony wyjść tylko poprzez zamknięcie okna konsoli.
decadenza
2

Miałem problemy z odpowiedziami tutaj, więc wpadłem na to, co działa dla mnie (TM):

cmd /c node_modules\.bin\tsc
cmd /c node rollup_build.js
pause
lama12345
źródło
1

Można to zrobić na dwa sposoby, zależnie od przypadku użycia

1) Jeśli chcesz, aby polecenie cmd systemu Windows pozostało otwarte, abyś mógł zobaczyć wynik wykonania i zamknąć go później; posługiwać się

pause

2) jeśli chcesz, aby polecenie cmd systemu Windows pozostało otwarte i pozwoliło na wykonanie niektórych poleceń po słowie; posługiwać się

cmd

wprowadź opis zdjęcia tutaj

Hitesh Sahu
źródło
1

Łatwo, dodaj cmd do ostatniej linii nietoperza, ALE! jeśli zresetujesz lub wyczyścisz ścieżkę systemową, musisz uruchomić cmd pełną ścieżką, na przykład:

%windir%\system32\cmd.exe

Na przykład mam plik nietoperza, aby zresetować jdk do starej wersji w następujący sposób:

PATH=C:\Program Files\Java\jdk1.6.0_45\bin;C:\apache-ant-1.7.1\bin
SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45
%windir%\system32\cmd.exe

ponieważ zresetowałem ścieżkę systemową, muszę uruchomić cmd z pełną ścieżką, inaczej system nie może znaleźć cmd.exe, uruchomienie cmd nie powiedzie się i po prostu zamknę okno, a nie będzie widać błędu msg .

Wei Kleeff
źródło