2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

Jak zapobiec zamykaniu się wiersza poleceń po wykonaniu?

Mój problem polega na tym, że w systemie Windows istnieją okna z wiersza poleceń, które zamykają się natychmiast po wykonaniu. Aby rozwiązać ten problem, chcę, aby domyślnym zachowaniem było to, że okno jest otwarte. Normalnie, tego zachowania można uniknąć za pomocą trzech metod, które przychodzą mi do głowy:

  1. Wstawianie linii pause za programami wsadowymi, aby zachęcić użytkownika do naciśnięcia klawisza przed wyjściem z
  2. Uruchamianie tych plików wsadowych lub innych narzędzi manipulujących linią poleceń (nawet uruchamianie serwisu, restart itp. za pomocą net start xy lub czegoś podobnego) w cmd.exe(Start - Run - cmd.exe)
  3. Uruchamianie tych programów z cmd /k jak to: cmd /k myprogram.bat

Ale są też inne przypadki, w których użytkownik:

  1. Uruchamia program za pierwszym razem i nie wie, że dany program uruchomi się w Command Prompt (Windows Command Processor) np. podczas uruchamiania skrótu z menu Start (lub z innego miejsca), OR
  2. Uważa za nieco niewygodne uruchamianie cmd.exe przez cały czas i nie ma czasu/ możliwości przepisania kodu tych komend wszędzie, aby zrobić za nimi pauzę lub uniknąć jednoznacznego wyjścia.

Przeczytałem artykuł o zmianie domyślnego zachowania cmd.exe podczas jednoznacznego otwierania go, z utworzeniem wpis AutoRun i manipulowaniu jego zawartością w tych miejscach:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Pozycje AutoRun to _String values_…)

Postawiłem cmd /d /k jako jego wartość, aby go wypróbować, ale to w ogóle nie zmieniło zachowania wyżej wymienionych rzeczy… Po prostu zmieniło to zachowanie okna linii poleceń przy otwieraniu go wprost (Start-Run-cmd.exe).

Więc jak to działa? Czy możesz dać mi jakieś pomysły na rozwiązanie tego problemu?

Odpowiedzi (11)

18
18
18
2011-07-04 17:45:20 +0000

Cytat Microsoft :

Konsola jest zamykana, gdy ostatni dołączony do niej proces kończy się lub wywołuje FreeConsole.

Innymi słowy, okno konsoli Win32 będzie zawsze zamykane, gdy zakończy się ostatni uruchomiony w niej program i nie można tego zmienić.


(Dla 16-bitowych programów MS-DOS, Windows oferuje opcję “Close on exit” w oknie właściwości, ale nie jest to wyjątek od powyższego zachowania: to proces NTVDM utrzymuje okno otwarte. Również ta opcja jest ponownie dla każdego programu).

8
8
8
2013-03-21 14:10:13 +0000

Otwórz polecenie w miejscu, w którym znajduje się Twój plik wsadowy i ręcznie wpisz nazwę pliku wsadowego, aby uruchomić go w tym oknie.

1.Przejdź do folderu, w którym znajduje się Twój plik wykonywalny 2.Shift-Right kliknij i wybierz “Command Window from here” 3.wpisz nazwę pliku wykonawczego i naciśnij enter 4.Proces powinien zostać uruchomiony, ale okno powinno pozostać otwarte.

4
4
4
2012-11-06 13:37:01 +0000

cmd.exe /k sprawi ci kłopoty z jakąś partią. Jeśli partia exit 1 (bez /B) twoja konsola zostanie zamknięta. Sztuczka polega na użyciu:

cmd.exe /k cmd /c ...

Aby użyć tego domyślnie dla wszystkich plików wsadowych, ustaw HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default) i HKEY_CLASSES_ROOT\batfile\shell\open\command\(default) na "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.

3
3
3
2014-04-26 16:55:23 +0000

Po przeczytaniu odpowiedzi grawity właśnie trafiłem na głupie rozwiązanie.

Moim przypadkiem użycia było skonfigurowanie środowiska konsoli w pracy, w którym zablokowane są wszystkie bardziej rozsądne rozwiązania. Potrzebuję tylko ustawić PATH i skonfigurować kilka aliasów doskey i zostać zrzuconym do powłoki.

Moje rozwiązanie (właśnie testowane na Win7) jako dodaj cmd jako ostatnią linię w pliku wsadowym. To uruchamia zagnieżdżoną komendę, która dziedziczy środowisko swojego rodzica. Powłoka potomna trzyma otwarty proces wsadowy do momentu wyjścia, w którym nie ma procesów potomnych, a także wyjścia.

2
2
2
2015-12-11 17:02:56 +0000

Załóżmy, że masz dwa pliki wsadowe, które chcesz uruchomić w ich własnej instancji i zachować otwarte, jeśli ich wykonanie zakończy się. Nazwijmy te dwie partie A.bat i B.bat.

Teraz dla uproszczenia możesz mieć plik wsadowy do uruchomienia ich obu, nazwijmy go launch_both.bat z treścią:

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

Może nie działać tak, jak się spodziewasz, jeśli wywołasz exit w jednym z dwóch plików wsadowych. To będzie musiało być przetestowane.

2
2
2
2013-03-21 20:02:36 +0000

Zamiast używać PAUSE (wolę CHOICE lub TIMEOUT niż PAUSE, gdy jest to konieczne), możesz skorzystać z tego rozwiązania tutaj: 886848/how-to-make-windows-batch-file-pause-when-double-clicked .

W ten sposób, jeśli klikniesz na plik wsadowy lub skrót (skrót) z eksploratora Windows, możesz mieć wstrzymanie programu przed jego zakończeniem, aby zobaczyć wyjście programu i wszelkie komunikaty o błędach.

Za pomocą funkcji WYBÓR można zaprogramować możliwość wyboru przez użytkownika różnych działań do wykonania, a za pomocą funkcji TIMEOUT można pozwolić na zamknięcie okna po upływie określonego czasu (bez nadzoru). Jeśli uruchomisz plik wsadowy z okna zachęty polecenia, te pauzy mogą być irytujące.

Powiązane rozwiązanie pozwoli Ci zdecydować, czy chcesz pominąć pauzy, jeśli plik wsadowy został uruchomiony z okna zachęty polecenia.

Możesz przeczytać więcej pod podanym linkiem, ale jego podstawą jest to, że wykorzystuje zmienną środowiskową:

%cmdcmdline%

do określenia, czy plik wsadowy został uruchomiony z okna poleceń, czy też nie.

Tak więc, używasz go w następujący sposób:

W miejscu, w którym plik wsadowy zostanie zamknięty, dodajesz kod w następujący sposób:

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt
1
1
1
2013-03-12 15:30:15 +0000

Najlepszym sposobem na obejście tego problemu jest wywołanie plików wsadowych z innego pliku wsadowego za pomocą start.

, więc jeśli normalnie uruchamiasz plik o nazwie go.bat, wtedy tworzysz drugi plik wsadowy o nazwie go2.bat

zawartość go2.bat będzie tylko

start go.bat

pierwsze okno zamyka się natychmiast, ale to, które uruchamiasz go.bat pozostaje otwarte.

1
1
1
2013-09-24 12:30:12 +0000

To działa dla wersji 5.00 Edytora rejestru Windows.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

Zapisz powyższe cmds w pliku o nazwie coś w rodzaju cmdbatfile-open.reg i wykonaj go!

0
0
0
2017-03-30 08:30:11 +0000

W przypadku użytkowników korzystających z Windows 10, należy pamiętać, że żadna z powyższych odpowiedzi nie działa obecnie dla Windows 10.

W przypadku Windows 10, jeśli masz dostęp do skryptu, musisz na końcu dodać następujący kod:

read

Kod ten będzie czekał na wejście przed zamknięciem.

0
0
0
2019-12-31 21:58:53 +0000

Pytanie OP jest o wiele bardziej zaangażowane niż to, czego potrzebowałem, więc ta odpowiedź jest dla innych, którzy przychodzą tu w poszukiwaniu prostego sposobu na uruchomienie programu z linii poleceń i utrzymanie otwartego okna po wyjściu programu z linii poleceń.

W moim przypadku, chciałem uruchomić NodeJS i utrzymać otwarte okno konsoli po zatrzymaniu NodeJS. Oto moje rozwiązanie:

Plik: RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

Następnie stworzyłem skrót do tego pliku na moim pulpicie i dwukrotnie kliknąłem skrót, aby uruchomić konsolę cmd.exe, która uruchamia komendę węzła i pozostaje otwarta po jego zakończeniu (komenda węzła).

Użyłem cmd.exe /k cmd /c node z powodu innej odpowiedzi udzielonej tutaj.

0
0
0
2017-06-30 03:30:27 +0000

W odpowiedzi na obniżoną ocenę PSIXO - “Odpowiedź ta została już omówiona w pytaniu. - Ro Yo Mi Jan 20 ‘16 o 5:06” – NIE, nie było. Poprzednie odpowiedzi były: “pauza”, która nie zadziałała. Odpowiedź PSIXO brzmiała: “pauza”: “& pauza”, która zadziałała. Proszę uważniej analizować przed obniżeniem oceny. Uruchomiłam to z podpowiedzi IDLE, i zadziałało:

>>> os.system('dir ^ & pause')
    0
    >>>

Z drugiej strony:

>>> os.system('dir ^ pause')
    1
    >>>

NIE zadziałało (podpowiedź cmd zawaliła się, i faktycznie zwróciła błąd (1)). Podziękowania dla PSIXO za odpowiedź, której potrzebowałem. Henry.