![Wie unterdrückt man die Bestätigung zur Beendigung eines Windows-Batchjobs?](https://rvso.com/image/1665763/Wie%20unterdr%C3%BCckt%20man%20die%20Best%C3%A4tigung%20zur%20Beendigung%20eines%20Windows-Batchjobs%3F.png)
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.