Mój problem polega na tym, że w systemie Windows istnieją okna wiersza polecenia, które zamykają się natychmiast po wykonaniu. Aby rozwiązać ten problem, chcę, aby domyślnym zachowaniem było pozostawienie otwartego okna. Zwykle tego zachowania można uniknąć za pomocą trzech metod, które przychodzą mi na myśl:
- Umieszczanie
pause
wiersza po programach wsadowych w celu poproszenia użytkownika o naciśnięcie klawisza przed wyjściem - Uruchamianie tych plików wsadowych lub innych narzędzi do manipulowania wierszem poleceń (nawet uruchamianie, restartowanie itp. Za pomocą
net start xy
lub coś podobnego) wcmd.exe
(Start - Run - cmd.exe) - Uruchamianie tych programów w
cmd /k
następujący sposób:cmd /k myprogram.bat
Ale są też inne przypadki, w których użytkownik:
- Uruchamia program za pierwszym razem i nie wie, że dany program będzie działał w wierszu polecenia (Windows Command Processor), np. Podczas uruchamiania skrótu z menu Start (lub z innego miejsca) LUB
- Trochę niewygodne jest uruchamianie cmd.exe przez cały czas i nie ma czasu / możliwości przepisania kodu tych poleceń wszędzie, aby po nich zatrzymać lub uniknąć jawnego wyjścia.
Przeczytałem artykuł o zmianie domyślnego zachowania cmd.exe
podczas otwierania go jawnie, z tworzeniem wpisu AutoRun i manipulowaniem jego zawartością w tych lokalizacjach:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun
(Elementy AutoRun są _String values_
...)
Podaję cmd /d /k
jako wartość, aby spróbować, ale to wcale nie zmieniło zachowania wyżej wymienionych rzeczy ... Po prostu zmieniło zachowanie okna wiersza poleceń podczas jawnego otwierania (Start-Run- cmd.exe).
Jak to działa? Czy możesz podać mi pomysły na rozwiązanie tego problemu?
źródło
stdout
na bieżąco, które nigdy nie powinny być widoczne z dobrego powodu.Odpowiedzi:
Mam rozwiązanie, które można zastosować tylko
.cmd
i.bat
pliki:Otwórz
regedit
i przejdź do każdego z:Teraz zmień „Domyślną wartość klucza” na
cmd.exe /k "%1" %*
. Teraz każde okno skryptu wsadowego pozostanie otwarte po jego wykonaniu.Zauważ, że jest to jak używanie
cmd.exe /c cmd.exe /k program.bat
, co oznacza, że inna instancja CMD zostanie uruchomiona w instancji nadrzędnej. Nie mogłem znaleźć sposobu na zastąpienie pierwszego/c
argumentu.Możesz to również zrobić za pomocą
[exefile]
, ale teraz pokaże puste pole konsoli, jeśli plik wykonywalny ma GUI.źródło
*
. Zachowaj ostrożność podczas edycji!Cytuj Microsoft :
Innymi słowy, okno konsoli Win32 będzie zawsze zamknięte, gdy ostatni program w nim zamknięty, i nie można tego zmienić.
(W przypadku 16-bitowych programów MS-DOS system Windows oferuje opcję „Zamknij przy wyjściu” w oknie dialogowym właściwości, ale nie jest to wyjątek od powyższego zachowania: proces NTVDM utrzymuje okno otwarte. Ponadto ta opcja jest ponownie na program).
źródło
How can I do X
, nieIn your opinion, should I do X
. Ta odpowiedź jest nieprzydatna, oznacza, że X jest niemożliwy, gdy częściowe rozwiązania zostały już przedstawione gdzie indziej. (-1)Wystarczy otworzyć wiersz polecenia w lokalizacji pliku wsadowego i ręcznie wprowadzić nazwę pliku wsadowego, aby uruchomić go w tym oknie.
1. Przejdź do folderu, w którym znajduje się plik wykonywalny
2. Kliknij prawym klawiszem Shift i wybierz „Okno poleceń stąd”
3. wpisz nazwę pliku wykonywalnego i naciśnij klawisz Enter
4. Proces powinien się uruchomić, ale okno powinno pozostać otwarte
źródło
cmd.exe /k
sprawi ci kłopot z jakąś partią. Jeśli partiaexit 1
(bez/B
) konsola zostanie zamknięta. Sztuką jest użycie:Aby używać tego domyślnie dla wszystkich plików wsadowych, ustaw
HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)
iHKEY_CLASSES_ROOT\batfile\shell\open\command\(default)
na"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*
.źródło
"%*"
przekazuje pełną listę parametrów, więc czy pierwszy parametr nie przejdzie dwa razy, raz za"%1"
razem jako pierwszy parametr"%*"
?%1 %2 %3 ..
i%*
które nie pamiętam w tej chwili, ale w%1 %2 %3
pracach w niektórych przypadkach, gdy%*
nie powiedzie się.Właśnie przeczytałem głupie rozwiązanie po przeczytaniu
grawity
odpowiedzi.Moim przypadkiem użycia było skonfigurowanie środowiska konsoli w pracy, w którym wszystkie bardziej rozsądne rozwiązania są blokowane. Wszystko, czego potrzebuję, to ustawić PATH i skonfigurować aliasy doskey i zostać zrzuconym do powłoki.
Moje rozwiązanie (właśnie przetestowane na Win7) jako dodane
cmd
jako ostatni wiersz w pliku wsadowym. Spowoduje to uruchomienie zagnieżdżonego wiersza polecenia, który dziedziczy środowisko swojego elementu nadrzędnego. Ta powłoka potomna utrzymuje proces wsadowy otwarty aż do WYJŚCIA, w którym to momencie partia nie ma procesów potomnych, a także kończy działanie.źródło
Zamiast używać PAUZY (wolę WYBÓR lub CZAS, niż w razie potrzeby używać PAUZY), możesz skorzystać z rozwiązania tutaj: 886848 / how-to-make-windows-batch-file-pause-when-double-click .
W ten sposób, jeśli klikniesz plik wsadowy lub łącze (skrót) w Eksploratorze Windows, możesz wstrzymać program pliku wsadowego przed wyjściem, aby wyświetlić wyniki programu i wszelkie komunikaty o błędach.
Korzystając z WYBORU, możesz zaprogramować możliwość wyboru przez użytkownika różnych działań, a użycie TIMEOUT może pozwolić na zamknięcie okna po pewnym czasie (bez nadzoru). Jeśli plik wsadowy zostanie uruchomiony z poziomu okna wiersza polecenia, te przerwy mogą być denerwujące.
Połączone rozwiązanie pozwoli Ci zdecydować, czy chcesz pominąć przerwy, jeśli plik wsadowy został uruchomiony z okna wiersza polecenia.
Możesz przeczytać więcej pod podanym linkiem, ale jego podstawą jest to, że używa zmiennej środowiskowej:
aby ustalić, czy plik wsadowy został uruchomiony z okna poleceń, czy nie.
Używasz go w ten sposób:
W miejscu, w którym plik wsadowy zostanie zamknięty, dodajesz taki kod:
źródło
Najlepszym sposobem na obejście tego problemu jest wywołanie plików wsadowych z innego pliku wsadowego przy użyciu polecenia Start.
więc jeśli normalnie uruchamiasz plik o nazwie go.bat, utworzyłbyś drugi plik wsadowy o nazwie coś takiego jak go2.bat
zawartość go2.bat byłaby po prostu
pierwsze okno zamyka się natychmiast, ale to, w którym uruchomiono go.bat, pozostaje otwarte
źródło
Działa to w przypadku wersji 5.00 Edytora rejestru systemu Windows.
Zapisz powyższe polecenia cmd w pliku o nazwie coś podobnego
cmdbatfile-open.reg
i uruchom je!źródło
Załóżmy, że masz dwa pliki wsadowe, które chcesz uruchomić we własnej instancji i pozostaną otwarte, jeśli ich plik wykonywalny zostanie zamknięty. Nazwijmy te dwie partie
A.bat
iB.bat
.Teraz dla uproszczenia możesz mieć plik wsadowy, aby uruchomić je oba, nazwijmy to
launch_both.bat
z zawartością:Może nie działać zgodnie z oczekiwaniami, jeśli wywołasz
exit
jeden z dwóch plików wsadowych. To będzie wymagało przetestowania.źródło
W przypadku użytkowników systemu Windows 10 zauważ, że żadna z powyższych odpowiedzi nie działa obecnie w systemie Windows 10.
W przypadku systemu Windows 10, jeśli masz dostęp do skryptu, musisz dodać następujący kod na końcu:
Ten kod będzie czekał na dane wejściowe przed zamknięciem.
źródło
W odpowiedzi na obniżoną wersję PSIXO - „Ta odpowiedź została już ujęta w pytaniu. - Ro Yo Mi Jan 20 '16 o 5:06” - NIE, NIE była. Poprzednie odpowiedzi brzmiały: „pauza”, która NIE działała. Odpowiedź PSIXO brzmiała: „& pauza”, która DZIAŁA. Proszę przeanalizować ostrożniej przed obniżeniem oceny. Uruchomiłem to z wiersza IDLE i zadziałało:
Z drugiej strony:
NIE działało (polecenie cmd prześlizgnęło się i faktycznie zwróciło błąd (1)). Dzięki PSIXO za odpowiedź, której potrzebowałem. Henz.
źródło