我正在運行一個程序,想查看它的返回代碼是什麼(由於它會根據不一樣的錯誤返回不一樣的代碼)。 git
我知道在Bash中,我能夠經過運行 shell
回聲$? windows
在Windows上使用cmd.exe怎麼辦? api
測試ErrorLevel
適用於控制檯應用程序,可是dmihailescu暗示,若是您試圖從命令提示符下運行窗口化應用程序(例如基於Win32的窗口) ,則此方法將無效。 一個窗口化的應用程序將在後臺運行,而且控件將當即返回到命令提示符(最有可能的ErrorLevel
爲零,以指示該進程已成功建立 )。 當窗口應用程序最終退出時,其退出狀態將丟失。 ide
可是,與其使用其餘地方提到的基於控制檯的C ++啓動器,一種更簡單的選擇是使用命令提示符下的START /WAIT
命令來啓動窗口應用程序。 這將啓動帶窗口的應用程序,等待其退出,而後將控制權返回到命令提示符,並在ErrorLevel
中設置進程的退出狀態。 測試
start /wait something.exe echo %errorlevel%
若是要徹底匹配錯誤代碼(例如等於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
一方面,我須要將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
當使用未附加到控制檯的程序時,它可能沒法正常工做,由於當您認爲本身具備退出代碼時,該應用程序可能仍在運行。 使用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; }
名爲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
的真實值。