887 votes

Comment puis-je obtenir l'application code de sortie à partir d'une ligne de commande de Windows?

Je suis en cours d'exécution d'un programme et que vous voulez voir ce que son code de retour est (puisqu'il retourne différents codes basés sur les différentes erreurs).

Je sais que dans Bash, je peux le faire en cours d'exécution

echo $?

Que dois-je faire lors de l'utilisation de cmd.exe sur Windows?

1087voto

Samuel Renkert Points 4139

Deux façons...

(1) Les résultats sont stockés dans une pseudo-variable d'environnement nommée errorlevel donc...

echo Exit Code is %errorlevel%

(2) et une syntaxe spéciale de la commande if:

if errorlevel

voir if /? pour plus de détails.

Par Exemple

@echo off
my_nify_exe.exe
if errorlevel 1 (
   echo Failure Reason Given is %errorlevel%
   exit /b %errorlevel%
)

Avertissement: si vous définissez un nom de variable d'environnement errorlevel, %errorlevel% permet de retourner la valeur et non le code de sortie. Utilisation (set errorlevel=) pour effacer la variable d'environnement, permettant l'accès à la vraie valeur de l' errorlevel via l' %errorlevel% variable d'environnement.

297voto

Gary Points 826

Test ErrorLevel fonctionne pour console applications, mais comme signalé par dmihailescu, cela ne fonctionnera pas si vous essayez d'exécuter une fenêtre de l'application (par exemple, Win32) à partir d'une invite de commande. Une fenêtre de l'application fonctionnera en arrière-plan, et le contrôle reviendra immédiatement à l'invite de commande (probablement avec un ErrorLevel de zéro pour indiquer que le processus a été créé avec succès). Lorsqu'une fenêtre de l'application, éventuellement, des sorties, de son statut de sortie est perdu.

Au lieu d'utiliser la console C++ lanceur mentionné ailleurs, même si, une alternative plus simple est de commencer une fenêtre de l'application à l'aide de l'invite de commande de l' START /WAIT commande. Cela va lancer la fenêtre de l'application, attendre pour sortir, puis revenir à l'invite de commandes avec le code de sortie du processus mis en ErrorLevel.

115voto

Adam Rosenfield Points 176408

27voto

Curtis Yallop Points 639

Si vous souhaitez faire correspondre le code d'erreur exactement (par exemple, est égal à 0), utilisez ceci:

@echo off
my_nify_exe.exe
if %ERRORLEVEL% EQU 0 (
   echo Failure Reason Given is %errorlevel%
   exit /b %errorlevel%
)

"si errorlevel 0" correspond à errorlevel >= 0. Voir"/?".

14voto

dmihailescu Points 471

Il pourrait ne pas fonctionner correctement lors de l'utilisation d'un programme qui n'est pas relié à la console, parce que cette application peut encore être en cours d'exécution lorsque vous pensez que vous avez le code de sortie. Une solution pour le faire en C++ ressemble à ci-dessous:

#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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X