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?

Srikanth
quelle
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.

BinaryMisfit
quelle
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
1
Hier ist sie : superuser.com/a/498798/56101
Totty.js
57

Drücken Sie zweimal Ctrl+ C.

Kirill V. Lyadvinsky
quelle
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
)
Gringo Suave
quelle
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!

Macke
quelle
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.)

sgmoore
quelle
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.

ViperGeek
quelle
+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.

Olegs Jeremejevs
quelle
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!


quelle
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).


quelle
0

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

Il Cognato
quelle
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.

ƬᴇcƬᴇιʜ007
quelle
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.

Charles Roper
quelle
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
)
kevinf
quelle
-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 .

Ricky Boyce
quelle
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.

Henri
quelle
5
Hat bei mir nicht funktioniert.
Helgi