Wie unterdrückt man die Bestätigung zur Beendigung eines Windows-Batchjobs?

Wie unterdrückt man die Bestätigung zur Beendigung eines Windows-Batchjobs?

Wenn ein Windows-Batchjob ein Programm (ausführbare Datei) gestartet hat, kann der Benutzer Strg-C drücken, um das Programm zu stoppen.

Dies führt dazu, dass der Windows-Batchjob die Eingabeaufforderung „Batchjob beenden (J/N)“ anzeigt und auf Tastendrücke wartet.

Wie kann ich diese Eingabeaufforderung und die Notwendigkeit, eine beliebige Taste zu drücken, unterdrücken?

Antwort1

Um den Vorschlag von @KTaTk zu erweitern: Solange Sie den Rückgabecode in der Bedingung überschreiben, wird die Eingabeaufforderung „Stapelauftrag beenden (J/N)“ unterdrückt.

Meine Problemumgehung ist:

setlocal enabledelayedexpansion
program.exe & set SAVEDRC=!ERRORLEVEL! & call;
echo Return Code was %SAVEDRC%
exit /b %SAVEDRC%

Beachten Sie, dass die Verwendung !ERRORLEVEL!der (verzögerten Erweiterung) erforderlich ist, um den Wert in derselben zusammengesetzten Anweisung zu erhalten, da die %ERRORLEVEL%(Erweiterung zur Analysezeit) nicht den aktualisierten Rückgabecode des Programms widerspiegelt.

Anschließend setzt die call;Funktion den Fehlerlevel auf 0 zurück, bevor die nächste Zeile ausgeführt wird.

Schließlich (optional) beenden wir den Vorgang mit dem gespeicherten Rückgabecode. Wenn dieser -1073741510 ( STATUS_CONTROL_C_EXIT) lautet und der übergeordnete Prozess ebenfalls eine cmd-Shell ist, zeigt der übergeordnete Prozess diese Eingabeaufforderung an.


Alternativ scheint es, dass die Strg-C-Eingabeaufforderung nur dann auftritt, wenn der Rückgabecode eines anderen Prozesses diesen Exit-Code verursacht. Das Erstellen einesFunktiondas einfach beendet wird, ohne den ERRORLEVEL zu ändern, unterdrückt die Eingabeaufforderung ebenfalls:

program.exe & call:ignoreCtrlC
echo Return Code was %ERRORLEVEL%
goto:eof
:ignoreCtrlC
exit /b

Antwort2

Sie könnenBedingte Ausführungim Befehl, der die ausführbare Datei startet:

my_executable.exe && exit 0 || exit 1

Dadurch werden alle Eingabeaufforderungen unterdrückt und der Batchauftrag wird mit dem Code 0 oder 1 beendet, abhängig vom Exitcode der ausführbaren Datei.

Dies funktioniert sowohl für Strg-C als auch für Strg-Untbr.

Antwort3

Da STRG-UNTBR oder STRG-C bereits ein Tastendruck ist, suchen Sie möglicherweise nach einer Lösung, die ein Batch-Skript stoppt, ohne dass STRG-C oder STRG-UNTBR gedrückt werden muss.

Diese Antwort gilt für den Fall, dass dies Ihr Ziel ist.

In Batch können Sie Beschriftungen und IF-Anweisungen verwenden, um in Ihrem Skript herumzuspringen.

Zum Beispiel:

    @echo off

::  -- Lets print something to the screen.
    echo This is a test before the loop starts

::  -- Lets set a counter variable to 0, just to be sure.
    set counter=0
    
::  -- Set loop beginning point
:begin

::  -- Increase the counter by one but don't display the result to the screen
    set /a counter=counter+1 >nul
    
::  -- now, write it to the screen our way.
    echo Progress: %counter% of 10
    
::  -- pause the script for a second but without any displaying...
    ping localhost -n 2 >nul
    
::  -- see if we reached 10, if so jump to the exit point of the script.
    if %counter%==10 goto exit
    
::  -- if we reached this point, we have not jumped to the exit point.
::  -- so instead, lets jump back to the beginning point.
::  -- identation is used so the loop clearly stands out in the script
goto begin
    
::  -- set exit point for this script
:exit

::  -- lets print a message. We don't have to, but its nice, right?
    echo End of the script has been reached.

Dies erzeugt die folgende Ausgabe, vorausgesetzt, wir haben c:\temp\counter.cmd geschrieben:

c:\temp>counter
This is a test before the loop starts
Progress: 1 of 10
Progress: 2 of 10
Progress: 3 of 10
Progress: 4 of 10
Progress: 5 of 10
Progress: 6 of 10
Progress: 7 of 10
Progress: 8 of 10
Progress: 9 of 10
Progress: 10 of 10
End of the script has been reached.

verwandte Informationen