2008-12-02 20 views
605

मैं एक प्रोग्राम चला रहा हूं और देखना चाहता हूं कि इसका रिटर्न कोड क्या है (क्योंकि यह विभिन्न त्रुटियों के आधार पर अलग-अलग कोड देता है)।मैं Windows कमांड लाइन से एप्लिकेशन निकास कोड कैसे प्राप्त करूं?

मैं बैश में जानता हूँ कि मैं चल

गूंज $ करके ऐसा कर सकते हैं?

विंडोज पर cmd.exe का उपयोग करते समय मैं क्या करूँ?

+6

सुपरयूसर पर भी पूछा गया: [बैच फ़ाइल में अंतिम आदेश के निकास कोड को कैसे देखें?] (Http://superuser.com/q/194662/126252) – Deanna

उत्तर

734

एक छद्म वातावरण चर नामित 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% कि मूल्य और नहीं बाहर निकलें कोड वापस आ जाएगी। पर्यावरण चर को साफ़ करने के लिए (errorlevel= सेट करें) errorlevel के वास्तविक मान तक पहुंच %errorlevel% पर्यावरण चर के माध्यम से उपयोग करें।

+24

यदि आप सीधे विंडोज से चल रहे हैं कमांड लाइन और हमेशा 0 लौटते हुए देखते हुए, गैरी का जवाब देखें: http://stackoverflow.com/a/11476681/31629 – Ken

+6

यदि आप पावरहेल में हैं तो आप 'इको एक्ज़िट कोड $ LastExitCode' –

+9

नोट का उपयोग कर सकते हैं नोट: "errorlevel 1 "अगर त्रुटि है तो त्रुटि है> = 1. तो" errorlevel 0 "सबकुछ से मेल खाएगा। देखो अगर /?"। इसके बजाय, आप "अगर% ERRORLEVEL% EQU 0 (..)" का उपयोग कर सकते हैं। –

82

उपयोग में निर्मित ERRORLEVEL वैरिएबल:

echo %ERRORLEVEL% 

लेकिन beware if an application has defined an environment variable named ERRORLEVEL!

+6

यह वास्तविक परिवेश चर नहीं है (जो जाहिर है, अगर यह उस प्रकार नामित एक चर है तो यह काम क्यों बंद कर देता है)। – Joey

+1

कृपया ध्यान दें कि यह पावरशेल –

+11

@SteelBrain में काम नहीं करता है: इसे PowerShell में '$ LastExitCode' कहा जाता है। –

11

कंसोल से जुड़े प्रोग्राम का उपयोग करते समय यह सही ढंग से काम नहीं कर सकता है, क्योंकि यह ऐप तब भी चल रहा है जब आपको लगता है कि आपके पास एक्जिट कोड है। एक समाधान 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; 
} 
191

परीक्षण ErrorLevelसांत्वना अनुप्रयोगों के लिए काम करता है, लेकिन जैसा कि dmihailescu द्वारा की ओर संकेत किया, इस अगर आप एक विडों को चलाने के लिए कोशिश कर रहे हैं काम नहीं करेगा कमांड प्रॉम्प्ट से एप्लिकेशन (जैसे Win32- आधारित)। पृष्ठभूमि में एक खिड़की वाला अनुप्रयोग चलाया जाएगा, और नियंत्रण तुरंत कमांड प्रॉम्प्ट पर वापस आ जाएगा (संभवतः ErrorLevel शून्य के साथ यह इंगित करने के लिए कि प्रक्रिया ने सफलतापूर्वक बनाया था)। जब एक खिड़की वाला अनुप्रयोग अंततः बाहर निकलता है, तो इसकी निकास स्थिति खो जाती है।

कंसोल-आधारित सी ++ लॉन्चर का उपयोग कहीं और उल्लिखित करने के बजाय, एक आसान विकल्प कमांड प्रॉम्प्ट के START /WAIT कमांड का उपयोग करके विंडो किए गए एप्लिकेशन को शुरू करना है। यह विंडो किए गए एप्लिकेशन को शुरू करेगा, इसके बाहर निकलने के लिए प्रतीक्षा करें, और फिर ErrorLevel में सेट की गई प्रक्रिया की निकास स्थिति के साथ कमांड प्रॉम्प्ट पर नियंत्रण वापस कर दें।

start /wait something.exe 
echo %errorlevel% 
+18

"स्टार्ट/प्रतीक्षा" विचार के लिए बहुत बहुत धन्यवाद। यह मेरे लिए काम किया :) – Timotei

+2

अच्छी पकड़। मुझे उस आदेश के बारे में पता नहीं था। मैंने इसे अभी देखा है> प्रारंभ/प्रतीक्षा notepad.exe – dmihailescu

+1

महान उत्तर के लिए काम कर रहा है! बहुत बहुत धन्यवाद! –

9

कि वास्तव में आप त्रुटि कोड मिलान करना चाहते हैं (उदाहरण के बराबर होती है 0), इस का उपयोग करें:

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

"अगर errorlevel 0" से मेल खाता है errorlevel> = 0. देखें "अगर /?"।

0

एक बिंदु पर मुझे सिग्विन से विंडोज इवेंट लॉग में लॉग इवेंट सटीक रूप से पुश करने की आवश्यकता थी। मैं चाहता था कि वेवएल में संदेश कस्टम हों, सही निकास कोड, विवरण, प्राथमिकताएं, संदेश इत्यादि। इसलिए मैंने इसकी देखभाल करने के लिए एक छोटी बैश स्क्रिप्ट बनाई। यहां यह गिटहब पर है, logit.sh

कुछ अंश:

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" 

यहाँ अस्थायी फ़ाइल सामग्री हिस्सा है:

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

बैच निष्पादित:

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 पर कॉल करना:

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