Warum denkt ein nicht interaktives Batch-Skript, dass ich control-C gedrückt habe?

8

Also tickt mein Batch-Skript gut, wenn es plötzlich im Ausgabe-Log erscheint:

%Vor%

und das Skript stoppt tot.

Das Stapelscript läuft in der Sitzung Null, daher weiß ich, dass es kein echtes Steuerelement-C empfangen hat und keiner meiner Code-Aufrufe GenerateConsoleCtrlEvent , also kann es nicht sein. Der einzige Hinweis ist, dass some-command zu diesem Zeitpunkt mit einer interaktiven Anwendung kommuniziert hat und die Konsole dieser -Anwendung eine control-C erhalten hat. Das erwartete Verhalten war, dass some-command den Exitcode der anderen Anwendung anzeigt und dann mit demselben Code beendet wird. Das Stapelscript hätte den Fehler angemessen behandelt, wenn es nicht totgestanden wäre.

Was ist hier los?

    
Harry Johnston 22.08.2014, 10:21
quelle

1 Antwort

10

Die Magie hier ist in Exit-Code 3221225786, alias 0xC000013A oder STATUS_CONTROL_C_EXIT.

Die interaktive Anwendung hat ein Steuerelement-C empfangen und es nicht abgefangen, sodass es wie erwartet mit STATUS_CONTROL_C_EXIT abgebrochen wurde. Die Anwendung some-command hat dies korrekt als Beendigungscode der fernen Anwendung gemeldet und sie an das Stapelscript zurückgegeben.

Was ich nicht erkannt hatte, war, dass cmd.exe control-C in einem Batch-Skript genau auf diese Weise erkennt, indem es überprüft, ob ein untergeordneter Prozess STATUS_CONTROL_C_EXIT zurückgibt. Also, indem ich diesen Fehlercode zurückgab, stoppte ich versehentlich das Stapel-Skript.

Dies kann mit einem einfachen Batch-Skript demonstriert werden:

%Vor%

was bei der Ausführung

ergibt %Vor%     
Harry Johnston 22.08.2014, 10:21
quelle

Tags und Links