Po naciśnięciu Ctrl + C w cmd aplikacja docelowa zostaje zakończona, ale jeśli aplikacja docelowa jest wywoływana z pliku wsadowego, otrzymujemy to potwierdzenie „Zakończ zadanie wsadowe (T / N)”. Nigdy nie pamiętam wystąpienia, w którym postanowiłem nie przerywać zadania wsadowego. Jak możemy pominąć to potwierdzenie?
windows
command-line
batch
Srikanth
źródło
źródło
N
. Jestem ciekawy, jaki masz scenariusz, w którym skrypt wsadowy kończy się po wejściuN
.-n
przełącznika do pingowania cygwin .Odpowiedzi:
AFAIK nie możesz, ponieważ takie zachowanie jest zaprojektowane i kontrolowane przez interpretera poleceń. Nie ma metody „mapowania”, a nawet „przechwytywania” tego, chyba że interpretujesz i rekompilujesz bezpośrednio interpretera.
źródło
start
sgmoore sugerowanego na stronie superuser.com/questions/35698/… wydaje mi się całkiem dobrym obejściem.Naciśnij Ctrl+ Cdwa razy.
źródło
Ctrl
i dotknijC
ponownie kontra uderzenieY
potemEnter
.Na tej stronie znalazłem skuteczne rozwiązanie:
Aby nie musieć wpisywać tego za każdym razem, gdy tworzyłem drugi skrypt wywoływany
script.cmd
w tym samym folderze z linią powyżej. Testowałem tę technikę tylko na XP, ale inni potwierdzili ją w Win 7.Nathan dodaje: kolejną opcją jest umieszczenie następującego kodu na górze script.cmd, który robi to samo w jednym pliku:
źródło
@IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])
. Nazywa się rekurencyjnie, ale z drugim argumentem. Jeśli twój skrypt zawiera argumenty, możesz potencjalnie użyć pierwszego nieużywanego argumentu pozycyjnego. Może to być problematyczne, jeśli twój skrypt ma wiele argumentów. Mój skrypt nie wymagał argumentów ani danych wejściowych od użytkownika.Zainstaluj Clink i zmień ustawienie „terminate_autoanswer”. Plik ustawień powinna być tutaj :
C:\Users\<username>\AppData\Local\clink\settings
.To wtedy „po prostu działa” w dowolnym oknie cmd.exe. Nie musisz zmieniać tego, co jest uruchomione lub w inny sposób, ponieważ klikaj piggy-backs na cmd.exe.
Cholernie niesamowite, IMO!
źródło
\cmder\config\settings
. Zobacz związany z tym problem github.com/cmderdev/cmder/issues/1666Jeśli nie musisz nic robić w pliku wsadowym po normalnym zakończeniu aplikacji, użycie
start
polecenia gwarantuje, że plik wsadowy jest już gotowy do momentu naciśnięcia klawiszy Ctrl-C. I dlatego wiadomość nie pojawi się.Na przykład:
(Testowane w systemie Windows XP.)
źródło
start
rzeczywiście by to pomogło, ale wydaje mi się to prawdopodobne. Zastanawiam się więc, czy głosowanie sugeruje, że to NIE zadziałałoby? A może ktoś, kto przegłosował, nie zna komendy Windowsstart
(a szczególniestart /wait
istart /b
)? Zobacz microsoft.com/resources/documentation/windows/xp/all/proddocs/… następnie. Proszę wyjaśnić opinię?start
nie zadziała. Za każdym razem, gdy cmd uruchamia plik wsadowy, naciśnięcie Ctrl + C spowoduje zakończenie bieżącego procesu i wyświetlenie pytania.start
polecenia podjął głupią decyzję, aby tytuł okna był jednocześnie obowiązkowy i opcjonalny - w dość mylący sposób. Więc jeśli kiedykolwiek twój%my_command%
jest ujęty w podwójne cudzysłowy, staje się tytułem okna, a pierwszy parametr w%my_params%
staje się poleceniem . Aby być bezpiecznym, użyjstart "some title here" %my_command% %my_params%
. Większość po prostu używa""
i przeklina programistę za nieużywanie opcji/TITLE
lub/T
zamiast do ustawienia tytułu.Przez chwilę walczyłem z tym pragnieniem, aby uniknąć monitu „Zakończ zadanie wsadowe”.
Moje ostatnie objawienie to trochę sztuczka ręki (lub okno konsoli), zastępując jedno wystąpienie
cmd.exe
innym. Odbywa się to poprzez wykonanie polecenia / programu,start cmd /k
po którym następuje natychmiastexit
w.BAT
pliku.Oryginalne okno konsoli znika, a zastępcze można zatrzymać w sposób czysty za pomocą Ctrl- C.
Rozważ następujący przykład sytuacji,
traceroute
która może zostać przerwana przez Ctrl+ Club może zostać wykonana, zwracając użytkownika doC:\>
monitu:Zastąpienie środowiska przez nowego interpretera poleceń może nie być dla wszystkich, ale gołym okiem wygląda i działa dobrze dla mnie.
źródło
exit /b
aby wyjść ze skryptu wsadowegoRozwiązanie Gringo jest dobre, ale nie działa dobrze ze skryptami, które przechodzą wzdłuż listy argumentów (tj.
python myscript.py %*
), PonieważSHIFT
nie aktualizują się%*
. Istnieją obejścia , ale mają pewne ograniczenia.Oto modyfikacja, z którą skończyłem:
99. (9)% bez zarzutu.
źródło
myscript.py
chcesz czytać ze standardowego wejścia.Zobacz to pytanie dotyczące przepełnienia stosu .
Jednak łatanie cmd.exe nie jest czymś, co bym dla tego zrobił.
źródło
W moim przypadku to plik ping.bat znajdował się w moim katalogu użytkownika (C: \ Users \ w Vista lub C: \ Documents and Settings \ w XP), który przechowywał zadanie wsadowe w nieokreślony sposób.
Ten plik wsadowy był wykonywany za każdym razem, gdy uruchomiłem polecenie ping z wiersza polecenia, gdzie bieżącym katalogiem jest mój katalog użytkownika. Pingowanie z okna Uruchom lub z katalogu innego użytkownika działało dobrze.
Usunąłem plik z mojego katalogu użytkownika i problem został rozwiązany!
źródło
Rozpocznij działa, ale teraz okno otwarte przez plik wsadowy zostało zmienione z moich opcji, a „właściwości” są wyłączone (nie będą odpowiadać).
źródło
Po prostu przekieruj standardowe wejście partii na zero, dodając <nul na końcu polecenia.
źródło
Natknąłem się na to z plikiem EXE, który wydawał się rzucać ^ C na partię nadrzędną przy wyjściu, powodując monit „Zakończ zadanie wsadowe” nawet przy czystym wyjściu.
Rozwiązaniem, które wybrałem, było uruchomienie partii z „Start”, podobnie jak w innych odpowiedziach, ale z monitu PowerShell (lub za pomocą metody interpretera PowerShell z CMD, jeśli wybierzesz).
Teraz jest 2018, a w Windows 10 Microsoft zaczął wypierać CMD z PowerShell jako preferowanym wierszem poleceń, więc jest domyślnie dostępny w GUI.
Start
jest aliasem dla Start-Process .Po uruchomieniu uruchamia się i wraca. Dlatego po zatrzymaniu uruchomionego procesu nie pojawia się monit „Zakończ zadanie wsadowe”.
Domyślnie nie czeka, więc nie są wymagane dodatkowe argumenty poza poleceniem i jego argumenty.
Używanie
start mything.exe -mythings -arguments
w mojej partii działało idealnie.W programie PowerShell skrypty muszą być poprzedzone ich ścieżką do uruchomienia, więc uruchamiam mój plik wsadowy jako
.\host.bat
.źródło
TCC / LE , który jest darmowym zamiennikiem CMD (traktuj to jako CMD ++), ma opcję ukrywania monitu o zakończenie zadania wsadowego. Można znaleźć tę opcję w oknie dialogowym konfiguracji uruchamiania TCC :
Zrzut ekranu:
Jeśli nigdy wcześniej nie słyszałeś o TCC / LE, oto kilka informacji na stronie:
Używałem TCC / LE od lat i 4NT przed nim. Mam w tym dużo miłości i mogę to polecić. Jedynym powodem, dla którego nadal go nie używam, jest fakt, że prawie wyłącznie używam PowerShell.
źródło
Głównym powodem, aby pominąć „Zakończ zadanie wsadowe (T / N)”, jest uruchomienie programu w pętli (np. Ponowne uruchomienie w przypadku awarii).
Ten https://stackoverflow.com/a/8185270/1170023 pomógł doprowadzić do tego rozwiązania:
źródło
Najłatwiejszym sposobem pominięcia potwierdzenia, jeśli używasz terminala Hyper , jest dodanie wtyczki hyper-yes .
źródło
Na końcu skryptu wystarczy dodać następującą komendę:
echo
To nie „uszkodzi” zachowania skryptu i wydaje się, że CDM nie pyta, czy chcesz zakończyć partię.
źródło