如何從Windows命令行獲取應用程序退出代碼?

我正在運行一個程序,想查看它的返回代碼是什麼(由於它會根據不一樣的錯誤返回不一樣的代碼)。 git

我知道在Bash中,我能夠經過運行 shell

回聲$? windows

在Windows上使用cmd.exe怎麼辦? api


#1樓

測試ErrorLevel適用於控制檯應用程序,可是dmihailescu暗示,若是您試圖從命令提示符下運行窗口化應用程序(例如基於Win32的窗口) ,則此方法將無效。 一個窗口化的應用程序將在後臺運行,而且控件將當即返回到命令提示符(最有可能的ErrorLevel爲零,以指示該進程已成功建立 )。 當窗口應用程序最終退出時,其退出狀態將丟失。 ide

可是,與其使用其餘地方提到的基於控制檯的C ++啓動器,一種更簡單的選擇是使用命令提示符下的START /WAIT命令來啓動窗口應用程序。 這將啓動帶窗口的應用程序,等待其退出,而後將控制權返回到命令提示符,並在ErrorLevel中設置進程的退出狀態。 測試

start /wait something.exe
echo %errorlevel%

#2樓

若是要徹底匹配錯誤代碼(例如等於0),請使用如下代碼: spa

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

if errorlevel 0與錯誤errorlevel > = if errorlevel 0相匹配if /?unix


#3樓

一方面,我須要將Cygwin的日誌事件準確地推送到Windows Event日誌。 我但願WEVL中的消息是自定義的,具備正確的退出代碼,詳細信息,優先級,消息等。所以,我建立了一個小Bash腳原本解決此問題。 它在GitHub logit.sh上日誌

一些摘錄: code

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"

這是臨時文件內容部分:

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"

這是在WEVL中建立事件的功能:

__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
}

執行批處理腳本並調用__create_event:

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

#4樓

當使用未附加到控制檯的程序時,它可能沒法正常工做,由於當您認爲本身具備退出代碼時,該應用程序可能仍在運行。 使用C ++的解決方案以下所示:

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

#5樓

名爲errorlevel僞環境變量存儲退出代碼:

echo Exit Code is %errorlevel%

另外, if命令具備特殊的語法:

if errorlevel

if /? 有關詳細信息。

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

警告:若是設置環境變量名稱errorlevel ,則%errorlevel%將返回該值,而不是退出代碼。 使用( set errorlevel= )清除環境變量,從而容許經過%errorlevel%環境變量訪問errorlevel的真實值。

相關文章
相關標籤/搜索