Jak ukryć potwierdzenie „Zakończ zadanie wsadowe (T / N)”?

153

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?

Srikanth
źródło
Czy próbowałeś kiedyś odpowiedzi sgmoore? superuser.com/questions/35698/…
Arjan
10
„Nigdy nie pamiętam wystąpienia, w którym postanowiłem nie kończyć zadania wsadowego”. W rzeczywistości w większości przypadków zadanie zostaje zakończone, nawet jeśli odpowiesz Nie ...
PhiLho
@PhiLho - To nie może być prawda, ponieważ moje skrypty zawsze działają po wejściu N. Jestem ciekawy, jaki masz scenariusz, w którym skrypt wsadowy kończy się po wejściu N.
dbenham
Miałem nadzieję, że będzie to łatwe, ale jak zwykle Microsoft sprawił, że coś prostego sprawiło ból w dupie. Poniższe odpowiedzi pochłaniają zbyt wiele wysiłku, aby uniknąć tej niewielkiej irytacji. Jestem po prostu zirytowany, że nie ma prostego sposobu na rozwiązanie tego. Poważnie, Microsoft, jaki jest sens tego monitu? Tak, jestem pewien, dlatego nacisnąłem Ctrl + C ...
Chev
Ten problem przynajmniej powoduje, że pamiętam i częściej korzystam z -nprzełącznika do pingowania cygwin .
palswim

Odpowiedzi:

53

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.

BinaryMisfit
źródło
39
To rozczarowujące :(
Srikanth,
Tak, to rozczarowujące. Jeszcze bardziej rozczarowujące jest to, że polecenie BREAK, które domyślnie nie robi nic pod XP, mogło zostać użyte do przełączenia monitu…
Synetech
3
Chociaż prawdą jest, że nie można sprawić, by interpreter zachowywał się inaczej, użycie polecenia startsgmoore sugerowanego na stronie superuser.com/questions/35698/… wydaje mi się całkiem dobrym obejściem.
Arjan
1
Oto on: superuser.com/a/498798/56101
Totty.js
57

Naciśnij Ctrl+ Cdwa razy.

Kirill V. Lyadvinsky
źródło
5
To nie zadziała, ale powtarza monit.
Joey,
8
Właśnie to zabiłem swoją bazę danych! Skrypt czekał na „pauzę”, więc zrobiłem CTRL-C, a następnie pojawił się monit, więc zrobiłem CTRL-C ponownie, a następnie plik wsadowy kontynuował i usunąłem moją bazę danych! @ patrz superuser.com/questions/740004/…
Sebastien Diot
2
Nie o to prosił PO. Równie łatwo mógłby wpisać „N” po ^ C.
vladr
3
@vladr to nieskończenie łatwiej trzymać Ctrli dotknij Cponownie kontra uderzenie Ypotem Enter.
Nick T
20
@SebastienDiot Wypróbowałeś nową technikę na skrypcie, która może trwale zniszczyć dane? To ... Odważny.
Podstawowy
57

Na tej stronie znalazłem skuteczne rozwiązanie:

script2.cmd < nul

Aby nie musieć wpisywać tego za każdym razem, gdy tworzyłem drugi skrypt wywoływany script.cmdw 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:

rem Bypass "Terminate Batch Job" prompt.
if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)
Gringo Suave
źródło
2
Jeśli plik wsadowy zostanie wywołany bezpośrednio (bez użycia polecenia CALL), wykonanie zostanie „trwale” przesłane. Jeśli STDIN zostanie przekierowany na NUL, nadal pojawi się monit „Zakończ zadanie wsadowe”, ale nie będzie czekać (ponieważ nie ma STDIN) na dane wejściowe. To działa dla mnie ...
William
3
Działa to w systemie Windows 7.
William
17
Działa, chyba że potrzebujesz danych wejściowych od użytkownika.
Augusto Men
2
@William, po prostu dzwoniąc skrypt nie działa na mnie, ale wpadłem na obejście: @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.
jpmc26,
Odpowiedź jpmc zadziałała dla mnie. To echo cholernego Terminate (t / n)? wiadomość na końcu się kończy, ale na tym się nie kończy.
ggb667
28

Zainstaluj Clink i zmień ustawienie „terminate_autoanswer”. Plik ustawień powinna być tutaj : C:\Users\<username>\AppData\Local\clink\settings.

# name: Auto-answer terminate prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1

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!

Macke
źródło
Clink jest fantastyczny, ale to nie działa dla mnie przy użyciu cmd.exe lub Console2. Nadal pyta i nie jest automatycznie wypełniany.
iono
@tometoftom: Czy zmieniłeś plik ustawień jak wyżej? Musiałem to zrobić, aby to zadziałało. (Pamiętaj, że musisz być administratorem, aby poprawnie zapisać plik w systemie Windows Vista i nowszych ...)
Macke
3
Ach, wciąż nie ma kości. głębokie westchnienie Microsoft, na miłość boską ...
iono
3
@iono czy masz nieanglojęzyczną wersję systemu Windows? W tym przypadku clink nie mógł automatycznie odpowiedzieć na monit do czasu wydania wersji 0.4.3 kilka dni temu: github.com/mridgers/clink/releases/tag/0.4.3
schlamar
3
Powiązane: dla osób używających cmder ustawienie jest włączone \cmder\config\settings. Zobacz związany z tym problem github.com/cmderdev/cmder/issues/1666
edmundo096
17

Jeśli nie musisz nic robić w pliku wsadowym po normalnym zakończeniu aplikacji, użycie startpolecenia gwarantuje, że plik wsadowy jest już gotowy do momentu naciśnięcia klawiszy Ctrl-C. I dlatego wiadomość nie pojawi się.

Na przykład:

@echo wyłączone

ustaw my_command = ping.exe
ustaw my_params = -t www.google.com

echo Polecenie do wykonania przez „start”:% my_command%% my_params%

:: Gdy NIE używasz / B lub / WAIT, spowoduje to utworzenie nowego okna, natomiast
:: wykonanie tego bardzo wsadowego pliku będzie kontynuowane w bieżącym oknie:

start% my_command%% my_params%

Echo.
echo Ta linia zostanie wykonana PRZED zakończeniem „startu”. Więc to
plik wsadowy echa zakończy się ZANIM jeden naciśnie Ctrl-C w drugim oknie.
Echo.

:: Tylko do testowania użyj „pauza”, aby pokazać „Naciśnij dowolny klawisz, aby kontynuować”, aby zobaczyć
:: dane wyjściowe poleceń „echo”. Pamiętaj, aby nacisnąć Ctrl-C w oknie
::, która uruchamia polecenie „ping” (nie w tym samym oknie). Lub po prostu usuń
:: następny wiersz, gdy się myli:

pauza

(Testowane w systemie Windows XP.)

sgmoore
źródło
Nie wiem, czy startrzeczywiś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 Windows start(a szczególnie start /waiti start /b)? Zobacz microsoft.com/resources/documentation/windows/xp/all/proddocs/… następnie. Proszę wyjaśnić opinię?
Arjan
startnie 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.
Joey,
1
+1 działa dla mnie. Jednak / b wyłącza obsługę Ctrl + C (co jest denerwujące).
Nick Bolton,
3
Jest to w porządku, jeśli klikniesz dwukrotnie plik wsadowy. Ale co, jeśli uruchomisz plik wsadowy w konsoli?
Helgi,
8
(Mówiąc z Windows 7, nie jestem pewien, czy dotyczy XP). Bezmyślny programista zatrudniony przez Microsoft do kodowania startpolecenia 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żyj start "some title here" %my_command% %my_params%. Większość po prostu używa ""i przeklina programistę za nieużywanie opcji /TITLElub /Tzamiast do ustawienia tytułu.
ADTC,
13

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.exeinnym. Odbywa się to poprzez wykonanie polecenia / programu, start cmd /kpo którym następuje natychmiast exitw .BATpliku.

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, traceroutektóra może zostać przerwana przez Ctrl+ Club może zostać wykonana, zwracając użytkownika do C:\>monitu:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

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.

ViperGeek
źródło
+1 Bardzo nowatorskie podejście i chociaż zgadzam się, że ti nie jest dokładną zamianą, działa dobrze (chociaż martwiłeś mnie, kiedy zacząłeś swój post od „zastępowania cmd.exe” - alarmy bezpieczeństwa dzwoniły, dopóki nie dotarłem do przykładu i zdałem sobie sprawę co miałeś na myśli)
Basic
powinieneś użyć, exit /baby wyjść ze skryptu wsadowego
Sebastian Godelet
1
@SebastianGodelet: To ogólnie dobra rada, ale tutaj rzeczywiście chodzi o zamknięcie (oryginalnego) okna konsoli , biorąc pod uwagę, że polecenie target jest uruchamiane w nowym oknie.
mklement0
Po co używać „cmd / k” (utrzymuj interpreter otwarty) zamiast „/ c”? Chcesz tylko zobaczyć wynik polecenia?
Raúl Salinas-Monteagudo
9

Rozwiązanie Gringo jest dobre, ale nie działa dobrze ze skryptami, które przechodzą wzdłuż listy argumentów (tj. python myscript.py %*), Ponieważ SHIFTnie aktualizują się %*. Istnieją obejścia , ale mają pewne ograniczenia.

Oto modyfikacja, z którą skończyłem:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99. (9)% bez zarzutu.

Olegs Jeremejevs
źródło
To nie zadziała, jeśli myscript.pychcesz czytać ze standardowego wejścia.
jamesdlin
0

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
0

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
0

Po prostu przekieruj standardowe wejście partii na zero, dodając <nul na końcu polecenia.

Il Cognato
źródło
2
Myślę, że miałeś na myśli <nul (ponieważ> nul wysyła wszystkie stdout do null).
Brian Phillips,
0

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.

Startjest 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 -argumentsw 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.

Ƭᴇcʜιᴇ007
źródło
0

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 :

Anuluj plik wsadowy na Ctrl-C : Anuluj przetwarzanie pliku wsadowego bez zwykłego monitu po naciśnięciu Control-C.

Zrzut ekranu:

Opcje TCC / LE

Jeśli nigdy wcześniej nie słyszałeś o TCC / LE, oto kilka informacji na stronie:

TCC / LE jest zamiennikiem wiersza poleceń CMD (domyślny wiersz polecenia systemu Windows). TCC / LE to nadzbiór CMD, zawierający 111 poleceń wewnętrznych (CMD ma mniej niż 40), 240 zmiennych wewnętrznych i funkcji oraz setki ulepszeń w istniejących poleceniach CMD.

TCC / LE współpracuje z istniejącymi aplikacjami wiersza polecenia i plikami wsadowymi, ale oferuje znaczną poprawę możliwości wiersza polecenia i plików wsadowych oraz dodaje tysiące nowych funkcji do okien wiersza polecenia.

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.

Charles Roper
źródło
0

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:

@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH

:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex

:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
  goto RUN
) else (
  rem echo Dedicated server is still running
  timeout /t 5 >nul
  goto LOOP
)
kevinf
źródło
-2

Najłatwiejszym sposobem pominięcia potwierdzenia, jeśli używasz terminala Hyper , jest dodanie wtyczki hyper-yes .

Ricky Boyce
źródło
Dlaczego głosowanie negatywne? Wskazałem, gdy używam tylko Hyper. To naprawdę świetne rozwiązanie, którego używam podczas korzystania z systemu Windows.
Ricky Boyce,
1
Pytanie dotyczy cmd.exe.
Raúl Salinas-Monteagudo
-3

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ę.

Henri
źródło
5
Nie działało dla mnie.
Helgi,