मुझे विंडोज कमांड लाइन से एप्लिकेशन निकास कोड कैसे मिलेगा?


797

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

मैं जानता हूं कि बैश में मैं दौड़कर ऐसा कर सकता हूं

इको $?

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



1
जैसे कि हम लिनक्स में कर सकते हैं "Win8 कैसे बाहर निकलने की स्थिति दिखाने के लिए CMD प्रॉम्प्ट प्राप्त करने के लिए प्रांप्ट करें।" यह शीर्ष चयन था, और सटीक है।
एसडीसोलर

1
आप जल्दी से देख सकते हैं कि कौन सा ऐप रिटर्न करता है:app.exe & echo %errorlevel%
marbel82

जवाबों:


976

एक छद्म पर्यावरण चर नाम दिया गया है 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%


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

9
इसके अलावा अगर आप अधिकार में हैं तो आप उपयोग कर सकते हैंecho Exit Code is $LastExitCode
ब्रैंडन पुघ

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

1
पाया मामलों जहां %ERRORLEVEL%0 है, भले ही एक त्रुटि हुई। %ERRORLEVEL%एक cmd फ़ाइल में जाँच करते समय हुआ । कोशिश करने से start /waitकाम नहीं चला। केवल एक चीज जो काम करती है वह हैif errorlevel 1 (...)
AlikElzin-kilaka

1
दोस्ताना सलाह:% errorlevel% एक खोल चर, नहीं एक वातावरण चर रहा है, और यह भी एक रिटर्न stringएक नहीं int, जिसका अर्थ है आप उपयोग नहीं कर सकते EQ/ NEQप्रभावी ढंग से।
kayleeFrye_onDeck

277

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

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

start /wait something.exe
echo %errorlevel%

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

3
अच्छा पकड़ा। मुझे उस कमांड के बारे में पता नहीं था। मैंने अभी इसे काम शुरू करने के लिए देखा है> notepad.exe
dmihailescu

1
एक और कारण यह काम नहीं कर सकता है (हमेशा शून्य) जब यह अंदर है ifया forइस उत्तर में वर्णित के!errorlevel! बजाय इसके उपयोग पर विचार करें ।
रोमन स्टार्कोव

100

6
यह एक वास्तविक वातावरण चर नहीं है (जो है, जाहिर है, कारण है कि यह काम करना बंद कर देता है, तो वहाँ है एक चर कि जिस तरह से नाम)।
जॉय

17
@SteelBrain: इसे पॉवरशेल $LastExitCodeमें कहा जाता है।
एलेक्स ए।

23

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

@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> = 0. देखें if /?


क्या यह केस-संवेदी है?
निशांत

1
क्रमांक, कमांड ("यदि" सहित) और "समान" कार्य कोई फर्क नहीं पड़ता कि मामला क्या है।
कर्टिस येलोप

14

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

कुछ कॉन्फ़िगरेशन में आपको #include <atlstr.h> जोड़ना चाहिए ताकि CString प्रकार पुनः प्राप्त हो।
जेक ओपीजे

8

यह ध्यान देने योग्य है कि .BAT और .CMD फाइलें अलग-अलग तरीके से काम करती हैं।

Https://ss64.com/nt/errorlevel.html पढ़ना यह नोट करता है:

रास्ते के बीच एक महत्वपूर्ण अंतर है। CMD और .BAT बैच फाइलें सेट की गई त्रुटियां हैं:

एक नया .BAT बैच स्क्रिप्ट जो 'नई' आंतरिक कमांड को चलाती है: APPEND, ASSOC, PATH, PROMPT, FTYPE और SET त्रुटि होने पर केवल ERRORLEVEL सेट करेंगे। इसलिए यदि आपके पास बैच स्क्रिप्ट में दो कमांड्स हैं और पहला फेल है, तो दूसरी कमांड के सफल होने के बाद भी ERRORLEVEL सेट रहेगा।

यह एक समस्या BAT स्क्रिप्ट को डीबग करना अधिक कठिन बना सकता है, एक CMD बैच स्क्रिप्ट अधिक सुसंगत है और आपके द्वारा [स्रोत] चलाने वाली प्रत्येक कमांड के बाद ERRORLEVEL सेट करेगा।

इससे मुझे दुःख का कोई अंत नहीं हो रहा था क्योंकि मैं लगातार आदेशों को निष्पादित कर रहा था, लेकिन विफलता की स्थिति में भी ERRORLEVEL अपरिवर्तित रहेगा।


0

एक बिंदु पर मुझे साइगविन से विंडोज इवेंट लॉग में लॉग इवेंट को सटीक रूप से पुश करने की आवश्यकता थी। मैं चाहता था कि WEVL में संदेश कस्टम हों, सही निकास कोड, विवरण, प्राथमिकताएं, संदेश आदि हों, इसलिए मैंने इस बात का ध्यान रखने के लिए थोड़ी बैश स्क्रिप्ट बनाई। यहाँ यह GitHub, 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"

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

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.