Wie unterdrücke ich die Bestätigung "Batch-Job beenden (J / N)"?


153

Wenn wir in cmd die Tastenkombination Strg + C drücken, wird die Zielanwendung beendet. Wenn die Zielanwendung jedoch aus einer Batchdatei aufgerufen wird, wird die Bestätigung "Batchjob beenden (J / N)" angezeigt. Ich kann mich nie an einen Fall erinnern, in dem ich den Batch-Job nicht beendet habe. Wie können wir diese Bestätigung überspringen?


Haben Sie jemals versucht, die Antwort von sgmoore zu finden? superuser.com/questions/35698/…
Arjan

10
"Ich kann mich nie an einen Fall erinnern, in dem ich den Batch-Job nicht beendet habe." Und tatsächlich wird der Job in den meisten Fällen beendet, auch wenn Sie mit Nein antworten ...
PhiLho

@PhiLho - Das kann nicht wahr sein, da meine Skripte nach der Eingabe immer fortgesetzt werden N. Ich bin gespannt, in welchem ​​Szenario das Batch-Skript nach der Eingabe beendet wird N.
Dbenham

Ich hatte gehofft, dass dies einfach sein würde, aber wie immer hat Microsoft etwas Einfaches zu einer Qual gemacht. Die folgenden Antworten sind alle viel zu aufwendig, um diesen kleinen Ärger zu vermeiden. Ich ärgere mich nur, dass es keinen einfachen Weg gibt, dies zu lösen. Im Ernst, Microsoft, wozu dient diese Eingabeaufforderung? Ja, ich bin mir sicher, deshalb
Chev

Dieses Problem veranlasst mich zumindest, mich an den -nSchalter für Cygwin- Ping zu erinnern und ihn häufiger zu verwenden.
Palswim

Antworten:


53

AFAIK können Sie nicht, da dieses Verhalten beabsichtigt ist und vom Befehlsinterpreter gesteuert wird. Es gibt keine Methode, dies zu "mappen" oder sogar "abzufangen", es sei denn, Sie dekompilieren den Interpreter direkt und kompilieren ihn erneut.


39
Das ist enttäuschend :(
Srikanth

Ja, es ist enttäuschend. Noch enttäuschender ist, dass der Befehl BREAK, der unter XP standardmäßig nichts bewirkt, verwendet werden konnte, um die Eingabeaufforderung
umzuschalten

3
Obwohl es kann wahr sein könnte nicht den Dolmetscher verhalten sich anders machen, mit startwie sgmoore bei vorgeschlagen superuser.com/questions/35698/... scheint völlig in Ordnung , Abhilfe zu mir.
Arjan


57

Drücken Sie zweimal Ctrl+ C.


5
Dies funktioniert nicht, sondern wiederholt die Aufforderung.
Joey

8
Ich habe gerade meine Datenbank damit getötet! Das Skript wartete auf "Pause", also habe ich STRG-C ausgeführt, und dann kam die Eingabeaufforderung, also habe ich STRG-C erneut ausgeführt, und dann wurde die Batchdatei glücklicherweise fortgesetzt und meine Datenbank gelöscht! @see superuser.com/questions/740004/...
Sebastien Diot

2
Das hat das OP nicht gefragt. Er könnte genauso gut "N" nach ^ C eingeben.
vladr

3
@vladr es ist unendlich viel leichter zu halten Ctrlund tippen Sie Cerneut im Vergleich zu schlagen Ydann Enter.
Nick T

20
@SebastienDiot Sie haben eine neue Technik für ein Skript ausprobiert, das das Potenzial hatte, Daten dauerhaft zu zerstören? Das ist ... mutig.
Basic

57

An dieser Stelle habe ich eine effektive Lösung gefunden:

script2.cmd < nul

Um dies nicht jedes Mal ausgeben zu müssen, habe ich ein zweites Skript erstellt, das script.cmdim selben Ordner wie die obige Zeile aufgerufen wurde . Ich habe diese Technik nur unter XP getestet, aber andere haben sie unter Win 7 bestätigt.

Nathan fügt hinzu: Eine andere Möglichkeit besteht darin, den folgenden Code oben in script.cmd einzufügen, der dasselbe in einer Datei tut:

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
)

2
Wenn Sie eine Batch-Datei von sich aus aufrufen (ohne den CALL-Befehl zu verwenden), wird die Ausführung "permanent" übertragen. Wenn STDIN zu NUL umgeleitet wird, wird weiterhin die Eingabeaufforderung "Batch-Job beenden" angezeigt, es wird jedoch nicht auf die Eingabe gewartet (da STDIN nicht mehr vorhanden ist). Das funktioniert bei mir ...
William

3
Dies funktioniert unter Windows 7.
William

17
Es funktioniert, es sei denn, Sie benötigen Benutzereingaben im Stapel.
Augusto Men

2
@William, rufen Sie einfach das Skript nicht für mich arbeiten, aber ich kam mit einer Vermeidung des Problems auf: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Ruft sich rekursiv auf, aber beim zweiten Mal mit einem Argument. Wenn Ihr Skript Argumente enthält, können Sie möglicherweise das erste nicht verwendete Positionsargument verwenden. Das kann problematisch sein, wenn Ihr Skript viele Argumente enthält. Mein Skript brauchte keine Argumente oder Benutzereingaben.
jpmc26

Die Antwort von jpmc hat bei mir funktioniert. Gibt es den verdammten Abbruch (j / n) wieder? Die Nachricht endet dann zwar, hört aber nicht damit auf.
ggb667

28

Installieren Sie Clink und ändern Sie die Einstellung "terminate_autoanswer". Die Einstellungsdatei sollte hier sein : 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

Dies funktioniert dann "nur" mit jedem cmd.exe-Fenster. Sie müssen nicht ändern, was läuft oder auf andere Weise, da Huckepack auf cmd.exe stoßen.

Verdammt geil, IMO!


Clink ist fantastisch, aber das funktioniert nicht mit cmd.exe oder Console2. Es fragt immer noch und es wird nicht automatisch ausgefüllt.
Iono

@tometoftom: Haben Sie die Einstellungsdatei wie oben geändert? Das musste ich tun, um es zum Laufen zu bringen. (Beachten Sie, dass Sie ein Administrator sein müssen, um die Datei unter Windows Vista und höher korrekt zu speichern ...)
Macke

3
Ah, immer noch keine Würfel. tiefes Seufzen Microsoft, um Gottes willen ...
Iono

3
@iono Hast du eine nicht englische Windows-Version? In diesem Fall konnte clink die Aufforderung erst mit der Veröffentlichung von 0.4.3 vor einigen Tagen automatisch beantworten: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
Verwandte: Für Benutzer von cmder ist die Einstellung aktiviert\cmder\config\settings . Siehe die Ausgabe hier github.com/cmderdev/cmder/issues/1666
edmundo096

17

Wenn Sie in der Stapeldatei nach der normalen Beendigung Ihrer Anwendung nichts mehr tun müssen, stellen Sie mit dem startBefehl sicher, dass die Stapeldatei bereits beendet ist, wenn Sie Strg-C drücken. Und daher wird die Nachricht nicht angezeigt.

Zum Beispiel:

@echo aus

set my_command = ping.exe
setze my_params = -t www.google.com

echo Befehl, der von 'start' ausgeführt werden soll:% my_command%% my_params%

:: Wenn Sie NICHT / B oder / WAIT verwenden, wird dabei ein neues Fenster erstellt
:: Die Ausführung dieser Batch-Datei wird im aktuellen Fenster fortgesetzt:

starte% my_command%% my_params%

Echo.
echo Diese Zeile wird ausgeführt, BEVOR 'start' überhaupt beendet ist. Also das
Die Echo-Batch-Datei wird abgeschlossen, BEVOR Sie im anderen Fenster die Tastenkombination Strg-C drücken.
Echo.

:: Verwenden Sie zum Testen 'pause', um "Drücken Sie eine beliebige Taste, um fortzufahren" anzuzeigen
:: die Ausgabe der 'Echo'-Befehle. Stellen Sie sicher, dass Sie im Fenster die Tastenkombination Strg-C drücken
:: führt den Befehl 'ping' aus (nicht in diesem Fenster). Oder einfach entfernen
:: die nächste Zeile bei Verwirrung:

Pause

(Getestet unter Windows XP.)


Ich weiß nicht, ob startdas wirklich helfen würde, aber es klingt für mich plausibel. Also frage ich mich, ob die Ablehnung impliziert, dass dies NICHT funktionieren würde? Oder vielleicht kennt der Abgestimmte den Windows- Befehl start(oder insbesondere start /waitund start /b) nicht? Siehe dann microsoft.com/resources/documentation/windows/xp/all/proddocs/… . Bitte erklären Sie die Ablehnung?
Arjan

startwird nicht funktionieren. Wenn cmd eine Batch-Datei ausführt, wird durch Antippen von Strg + C der aktuell ausgeführte Prozess beendet und die Frage angezeigt.
Joey

1
+1 funktioniert bei mir. / B deaktiviert jedoch die Tastenkombination Strg + C (was ärgerlich ist).
Nick Bolton

3
Dies ist in Ordnung, wenn Sie auf die Batchdatei doppelklicken. Aber was ist, wenn Sie die Batch-Datei in der Konsole starten?
Helgi

8
(Unter Windows 7, nicht sicher, ob dies für XP zutreffend ist) Der gedankenlose Entwickler, der von Microsoft beauftragt wurde, den startBefehl zu codieren , traf die dumme Entscheidung, den Titel des Fensters gleichzeitig als obligatorisch und optional festzulegen - auf verwirrende Weise. Wenn Ihr %my_command%also in doppelte Anführungszeichen eingeschlossen ist, wird dies zum Titel des Fensters und der erste Parameter %my_params%zum Befehl . Verwenden Sie zur Sicherheit start "some title here" %my_command% %my_params%. Die meisten verwenden ""und verfluchen den Entwickler nur, weil sie nicht die Option /TITLEoder /Tverwenden, um den Titel festzulegen.
ADTC

13

Ich habe mit diesem Wunsch gekämpft, die Eingabeaufforderung "Batch-Job beenden" für eine Weile zu umgehen.

Meine letzte Offenbarung ist ein bisschen wie ein Kinderspiel (oder ein Konsolenfenster), indem ich eine Instanz durch eine cmd.exeandere ersetze . Dies wird erreicht, indem der Befehl / das Programm über ausgeführt wird, start cmd /kunmittelbar gefolgt von exitin der .BATDatei.

Das ursprüngliche Konsolenfenster verschwindet und der Austausch kann man sauber über gestoppt werden Ctrl- C.

Stellen Sie sich das folgende Beispiel für ein tracerouteSymbol vor, das durch Ctrl+ unterbrochen Coder abgeschlossen werden kann, um den Benutzer zur C:\>Eingabeaufforderung zurückzukehren:

@echo off

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

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

Die Umgebungsersetzung eines neuen Befehlsinterpreters ist vielleicht nicht jedermanns Sache, aber mit bloßem Auge sieht es gut aus und funktioniert gut für mich.


+1 Ein sehr neuartiger Ansatz, und obwohl ich der Meinung bin, dass dies kein genauer Ersatz ist, funktioniert er gut (obwohl Sie mir Sorgen gemacht haben, als Sie Ihren Beitrag mit "Ersetzen von cmd.exe" begonnen haben - Sicherheitsalarme klingelten, bis ich zum Beispiel kam und es realisierte was du meintest)
Basic

Sie sollten verwenden exit /b, um das Batch-Skript zu
beenden

1
@SebastianGodelet: Das ist ein guter Rat im Allgemeinen, aber hier ist die Absicht ist in der Tat der (original) Konsole zu schließen Fenster , da der Zielbefehl in einem gestartet wird neues Fenster.
mklement0

Warum "cmd / k" anstelle von "/ c" verwenden (den Interpreter offen lassen)? Nur um die Ausgabe des Befehls sehen zu können?
Raúl Salinas-Monteagudo

9

Die Lösung von Gringo ist gut, funktioniert aber nicht gut mit Skripten, die die Argumentliste (dh python myscript.py %*) durchlaufen , da SHIFTsie nicht aktualisiert werden %*. Es gibt Problemumgehungen , die jedoch bestimmte Einschränkungen aufweisen.

Hier ist die Modifikation, mit der ich endete:

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

99. (9)% fehlerfrei.


Dies funktioniert nicht, wenn myscript.pyvon stdin gelesen werden soll.
Jamesdlin


0

In meinem Fall war es die ping.bat-Datei, die sich direkt in meinem Benutzerverzeichnis befand (C: \ Users \ in Vista oder C: \ Documents and Settings \ in XP), die den Stapeljob unbestimmt hielt.

Diese Batchdatei wurde immer dann ausgeführt, wenn ich an der Eingabeaufforderung ping ausgeführt habe, wobei das aktuelle Verzeichnis mein Benutzerverzeichnis ist. Das Pingen aus dem Fenster "Ausführen" oder aus dem Verzeichnis eines anderen Benutzers lief einwandfrei.

Entfernte die Datei aus meinem Benutzerverzeichnis und das Problem wurde behoben!


0

Start funktioniert, aber jetzt wird das von der Batch-Datei geöffnete Fenster von den Optionen geändert, die ich hatte, und die "Eigenschaften" sind deaktiviert (reagieren nicht).


0

Leiten Sie einfach das Batch-Stdin auf null um, indem Sie <nul am Ende des Befehls hinzufügen.


2
Ich denke, Sie haben vielleicht <nul gemeint (da das> nul alle stdout auf null sendet).
Brian Phillips

0

Ich bin mit einer EXE-Datei darauf gestoßen, die beim Beenden ^ C auf den übergeordneten Stapel zu werfen schien, was dazu führte, dass die Eingabeaufforderung "Batch-Job beenden" auch bei einem sauberen Beenden angezeigt wurde.

Die von mir gewählte Lösung bestand darin, den Stapel mit "Start" auszuführen, ähnlich wie bei anderen Antworten, jedoch über eine PowerShell-Eingabeaufforderung (oder über die PowerShell-Interpreter-Methode von CMD, wenn Sie dies wünschen).

Es ist 2018 und in Windows 10 hat Microsoft damit begonnen, CMD durch PowerShell als bevorzugte Eingabeaufforderung zu ersetzen, sodass es standardmäßig in der GUI verfügbar ist.

Startist ein Alias ​​für Start-Process .

Wenn es ausgeführt wird, wird es nur gestartet und kehrt zurück. Wenn Sie den gestarteten Prozess beenden, wird keine Eingabeaufforderung zum Beenden des Batch-Jobs angezeigt.

Standardmäßig wird nicht gewartet, daher sind keine zusätzlichen Argumente nach dem Befehl und den zugehörigen Argumenten erforderlich.

Die Verwendung start mything.exe -mythings -argumentsin meiner Charge hat einwandfrei funktioniert.

In PowerShell-Skripten muss vor dem Start der Pfad angegeben werden, damit ich meine Batchdatei als ausführen kann .\host.bat.


0

TCC / LE , ein kostenloser CMD-Ersatz (CMD ++), bietet die Option, die Eingabeaufforderung zum Beenden des Batch-Jobs zu unterdrücken. Sie finden die Option im TCC-Startkonfigurationsdialog :

Batch-Datei bei Strg-C abbrechen: Brechen Sie die Batch-Dateiverarbeitung ohne die übliche Eingabeaufforderung ab, wenn Sie Strg-C drücken.

Bildschirmfoto:

TCC / LE-Optionen

Wenn Sie noch nie von TCC / LE gehört haben, lesen Sie bitte die folgenden Informationen auf der Website:

TCC / LE ist ein Ersatz für die CMD-Befehlszeile (die Standard-Windows-Eingabeaufforderung). TCC / LE ist eine Obermenge von CMD mit 111 internen Befehlen (CMD hat weniger als 40), 240 internen Variablen und Funktionen und Hunderten von Verbesserungen an vorhandenen CMD-Befehlen.

TCC / LE funktioniert mit Ihren vorhandenen Befehlszeilenanwendungen und Batch-Dateien, bietet jedoch wesentliche Verbesserungen bei den Befehlszeilen- und Batch-Dateifunktionen und fügt Ihren Eingabeaufforderungsfenstern Tausende neuer Funktionen hinzu.

Ich habe TCC / LE jahrelang benutzt und 4NT davor. Ich habe viel Liebe dazu und kann es weiterempfehlen. Der einzige Grund, warum ich es nicht mehr benutze, ist, dass ich jetzt fast ausschließlich PowerShell benutze.


0

Ein Hauptgrund, um den "Batch-Job beenden (J / N)" zu unterdrücken, besteht darin, ein Programm in einer Schleife auszuführen (z. B .: erneut ausführen, falls es abstürzt).

Diese https://stackoverflow.com/a/8185270/1170023 hat zu dieser Lösung geführt:

@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
)

-2

Wenn Sie das Hyper- Terminal verwenden, können Sie die Bestätigung am einfachsten unterdrücken, indem Sie das Hyper-Yes- Plugin hinzufügen .


Warum die Gegenstimme? Ich habe nur bei der Verwendung von Hyper angegeben. Es ist eigentlich eine großartige Lösung, die ich bei der Verwendung von Windows benutze.
Ricky Boyce

1
Die Frage ist über cmd.exe.
Raúl Salinas-Monteagudo

-3

Fügen Sie am Ende Ihres Skripts einfach den folgenden Befehl hinzu:
echo
Dadurch wird das Verhalten Ihres Skripts nicht "beschädigt", und CDM wird anscheinend nicht gefragt, ob Sie den Stapel beenden möchten.


5
Hat bei mir nicht funktioniert.
Helgi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.