980 Stimmen

Wie erhalte ich den Exit-Code der Anwendung über die Windows-Befehlszeile?

Ich führe ein Programm aus und möchte sehen, welchen Rückgabecode es hat (da es bei verschiedenen Fehlern unterschiedliche Codes zurückgibt).

Ich weiß, dass ich in der Bash dies tun kann, indem ich

echo $?

Was muss ich tun, wenn ich cmd.exe unter Windows verwende?

8 Stimmen

1 Stimmen

Ich habe nach "Win8 How to get CMD prompt to show exit status" gegoogelt, so wie wir es in Linux tun können. Dies war die erste Auswahl und ist genau.

2 Stimmen

Sie können schnell sehen, was die App zurückgibt: app.exe & echo %errorlevel%

14voto

dmihailescu Punkte 1515

Wenn Sie ein Programm verwenden, das nicht mit der Konsole verbunden ist, kann es sein, dass es nicht richtig funktioniert, weil die Anwendung noch läuft, während Sie denken, dass Sie den Exit-Code haben. Eine Lösung in C++ sieht wie folgt aus:

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "tchar.h"
#include "stdio.h"
#include "shellapi.h"

int _tmain( int argc, TCHAR *argv[] )
{

    CString cmdline(GetCommandLineW());
    cmdline.TrimLeft('\"');
    CString self(argv[0]);
    self.Trim('\"');
    CString args = cmdline.Mid(self.GetLength()+1);
    args.TrimLeft(_T("\" "));
    printf("Arguments passed: '%ws'\n",args);
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc < 2 )
    {
        printf("Usage: %s arg1,arg2....\n", argv[0]);
        return -1;
    }

    CString strCmd(args);
    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        (LPTSTR)(strCmd.GetString()),        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d)\n", GetLastError() );
        return GetLastError();
    }
    else
        printf( "Waiting for \"%ws\" to exit.....\n", strCmd );

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
    int result = -1;
    if(!GetExitCodeProcess(pi.hProcess,(LPDWORD)&result))
    { 
        printf("GetExitCodeProcess() failed (%d)\n", GetLastError() );
    }
    else
        printf("The exit code for '%ws' is %d\n",(LPTSTR)(strCmd.GetString()), result );
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    return result;
}

0voto

jonretting Punkte 412

An einem Punkt musste ich Protokollereignisse von Cygwin in das Windows-Ereignisprotokoll übertragen. Ich wollte, dass die Meldungen im WEVL benutzerdefiniert sind und den richtigen Exit-Code, Details, Prioritäten, Meldungen usw. haben. Also habe ich ein kleines Bash-Skript erstellt, das sich um diese Aufgabe kümmert. Hier ist es auf GitHub, logit.sh .

Einige Auszüge:

usage: logit.sh [-h] [-p] [-i=n] [-s] <description>
example: logit.sh -p error -i 501 -s myscript.sh "failed to run the mount command"

Hier ist der Teil mit dem temporären Dateiinhalt:

LGT_TEMP_FILE="$(mktemp --suffix .cmd)"
cat<<EOF>$LGT_TEMP_FILE
    @echo off
    set LGT_EXITCODE="$LGT_ID"
    exit /b %LGT_ID%
EOF
unix2dos "$LGT_TEMP_FILE"

Hier ist eine Funktion, um Ereignisse in WEVL zu erstellen:

__create_event () {
    local cmd="eventcreate /ID $LGT_ID /L Application /SO $LGT_SOURCE /T $LGT_PRIORITY /D "
    if [[ "$1" == *';'* ]]; then
        local IFS=';'
        for i in "$1"; do
            $cmd "$i" &>/dev/null
        done
    else
        $cmd "$LGT_DESC" &>/dev/null
    fi
}

Ausführen des Batch-Skripts und Aufruf von __create_event:

cmd /c "$(cygpath -wa "$LGT_TEMP_FILE")"
__create_event

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X