উইন্ডোজ কমান্ড লাইন থেকে আমি কীভাবে অ্যাপ্লিকেশন প্রস্থান কোড পাব?


797

আমি একটি প্রোগ্রাম চালাচ্ছি এবং এটির রিটার্ন কোডটি কী তা দেখতে চাই (যেহেতু এটি বিভিন্ন ত্রুটির ভিত্তিতে বিভিন্ন কোড দেয়)।

আমি ব্যাশে জানি আমি দৌড়ে এই কাজটি করতে পারি

প্রতিধ্বনি $?

উইন্ডোজে cmd.exe ব্যবহার করার সময় আমি কী করব?


8
সুপার ব্যবহারকারীকেও জিজ্ঞাসা করা হয়েছে: ব্যাচ ফাইলে সর্বশেষ কমান্ডের প্রস্থান কোড কীভাবে চেক করা যায়?
Deanna

1
"উইন 8 কীভাবে সিএমডি থেকে প্রস্থান স্থিতি প্রদর্শন করতে প্রম্পট পাবেন" এর জন্য গুগল করা যেমন আমরা লিনাক্সে করতে পারি। এটি শীর্ষ নির্বাচন ছিল এবং সঠিক is
এসডসোলার

1
অ্যাপটি কী ফিরিয়ে দেয় তা আপনি তাড়াতাড়ি দেখতে পারবেন:app.exe & echo %errorlevel%
মার্বেল 82

উত্তর:


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 টি ফিরে দেখছেন, গ্যরির
কেন

9
এছাড়াও আপনি পাওয়ারশেলে থাকলে আপনি ব্যবহার করতে পারেনecho Exit Code is $LastExitCode
ব্র্যান্ডন পুগ

11
দ্রষ্টব্য: "ত্রুটিযুক্ত 1" যদি সত্য হয় ত্রুটিযুক্ত> = 1। সুতরাং "ত্রুটিযুক্ত 0" সমস্ত কিছুর সাথে মিলবে। যদি দেখতে /?". পরিবর্তে, আপনি "যদি% ERRORLEVEL% EQU 0 (..)" ব্যবহার করতে পারেন।
কর্টিস ইয়ালাপ

1
%ERRORLEVEL%একটি ত্রুটি ঘটেছে যদিও 0 যেখানে ক্ষেত্রে পাওয়া গেছে । %ERRORLEVEL%একটি সিএমডি ফাইল চেক করার সময় ঘটেছিল । চেষ্টা করেও start /waitকাজ হয়নি। একমাত্র কাজটি হয়েছিলif errorlevel 1 (...)
অ্যালিকেলজিন-কিলাকা

1
বন্ধুত্বপূর্ণ পরামর্শ:% ErrorLevel% একটি শেল পরিবর্তনশীল, কোনো এনভায়রনমেন্ট ভেরিয়েবল, এবং এটা আরো একটি ফেরৎ stringএকটি না int, যার অর্থ আপনি ব্যবহার করতে পারবেন না EQ/ NEQকার্যকরভাবে।
kayleeFrye_onDeck

277

টেস্টিং ErrorLevelজন্য কাজ করে কনসোল অ্যাপ্লিকেশন, কিন্তু এ hinted dmihailescu দ্বারা , এই কাজের আপনি একটি চালানোর চেষ্টা করছেন না করবে না বাতায়নযুক্ত আবেদন (যেমন Win32 ভিত্তিক) কমান্ড প্রম্পট থেকে। একটি উইন্ডোযুক্ত অ্যাপ্লিকেশন পটভূমিতে চলবে, এবং নিয়ন্ত্রণ তত্ক্ষণাত কমান্ড প্রম্পটে ফিরে আসবে (সম্ভবত ErrorLevelশূন্যের একটি দিয়ে প্রক্রিয়াটি সফলভাবে তৈরি হয়েছিল তা বোঝাতে )। যখন উইন্ডোযুক্ত অ্যাপ্লিকেশনটি শেষ পর্যন্ত প্রস্থান করে, এর প্রস্থান স্থিতিটি নষ্ট হয়ে যায়।

অন্য কোথাও উল্লিখিত কনসোল-ভিত্তিক সি ++ লঞ্চার ব্যবহার করার পরিবর্তে, কমান্ড প্রম্পটের কমান্ড ব্যবহার করে উইন্ডোযুক্ত অ্যাপ্লিকেশন শুরু করা একটি সহজ বিকল্প START /WAIT। এটি উইন্ডোযুক্ত অ্যাপ্লিকেশনটি শুরু করবে, এটি প্রস্থান হওয়ার জন্য অপেক্ষা করবে এবং তারপরে প্রক্রিয়াটি নির্ধারণের স্থিতি সহ কমান্ড প্রম্পটে নিয়ন্ত্রণ ফিরিয়ে দেবে ErrorLevel

start /wait something.exe
echo %errorlevel%

20
"স্টার্ট / অপেক্ষা" ধারণাটির জন্য অনেক ধন্যবাদ। এটি আমার জন্য কাজ করেছিল :)
টিমোতেই

3
চমৎকার ধরা. আমি এই আদেশ সম্পর্কে জানতাম না। আমি সবেমাত্র এটি শুরু> অপেক্ষা করুন নোটপ্যাড.এক্সইএর জন্য কাজ করতে দেখেছি
dmihailescu

1
এটি কাজ না করার কারণের আরেকটি কারণ (সর্বদা শূন্য) যখন এটি কোনও ifবা এর ভিতরে থাকে for!errorlevel!পরিবর্তে ব্যবহার করা বিবেচনা করুন , যেমন এই উত্তরে বর্ণিত হয়েছে
রোমান স্টারকভ

100

অন্তর্নির্মিত ERRORLEVEL পরিবর্তনশীল ব্যবহার করুন:

echo %ERRORLEVEL%

তবে সাবধান হন যদি কোনও অ্যাপ্লিকেশন এররোলভেল নামের পরিবেশের পরিবর্তনশীল সংজ্ঞা দেয় !


6
এটি একটি প্রকৃত এনভায়রনমেন্ট ভেরিয়েবল নয় (যা হয়, অবশ্যই, কেন এটা কাজ ceases যদি হয় একটি পরিবর্তনশীল যে ভাবে নামে)।
জোয়

17
@ স্টিলব্রেন: $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
নং ওয়ার, কমান্ড ("if" সহ) এবং "ইক্যু" কাজটি কেসই হোক না কেন কাজ করে।
কর্টিস ইয়ালাপ

14

কনসোলের সাথে সংযুক্ত নয় এমন কোনও প্রোগ্রাম ব্যবহার করার সময় এটি সঠিকভাবে কাজ করতে পারে না, কারণ আপনার অ্যাপটি থেকে বেরিয়ে যাওয়ার কোডটি মনে করার সময় সেই অ্যাপটি এখনও চলমান থাকতে পারে। সি ++ এ করার একটি সমাধান নীচের মত দেখাচ্ছে:

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

কিছু কনফিগারেশনে আপনার # অন্তর্ভুক্ত <atlstr.h> যুক্ত করা উচিত যাতে সিএসস্ট্রিং টাইপটি পুনরায় সংযুক্ত হয়।
জেক ওপজে

8

.BAT এবং .CMD ফাইলগুলি আলাদাভাবে কাজ করে তা লক্ষ করার মতো।

Https://ss64.com/nt/errorlevel.html পড়া এটিতে নীচের বিষয়গুলি উল্লেখ করা হয়েছে:

.CMD এবং .BAT ব্যাচ ফাইলগুলি ত্রুটিযুক্ত স্তরগুলি সেট করার মধ্যে একটি মূল পার্থক্য রয়েছে:

'নতুন' অভ্যন্তরীণ কমান্ডগুলি চালিত একটি পুরানো .BAT ব্যাচের স্ক্রিপ্ট: কোনও ত্রুটি দেখা দিলে কেবলমাত্র সংযোজন, এসএসওসি, পাঠ, প্রম্পট, এফটিওয়াইপি এবং এসইটি কেবল ERRORLEVEL সেট করবে। সুতরাং আপনার যদি ব্যাচের স্ক্রিপ্টে দুটি কমান্ড থাকে এবং প্রথম ব্যর্থ হয় তবে দ্বিতীয় কমান্ড সাফল্যের পরেও ERRORLEVEL সেট থাকবে।

এটি বিট স্ক্রিপ্টটি ডিবাগিংকে আরও জটিল করে তুলতে পারে, একটি সিএমডি ব্যাচের স্ক্রিপ্ট আরও সামঞ্জস্যপূর্ণ এবং আপনি [উত্স] দ্বারা চালিত প্রতিটি আদেশের পরে ERRORLEVEL সেট করবে will

আমি ক্রমান্বয়ে কমান্ডগুলি সম্পাদন করায় এটি আমার শোকের শেষের কারণ ছিল না, তবে ব্যর্থতার পরেও এররোলভেল অপরিবর্তিত থাকবে।


0

এক পর্যায়ে আমাকে সাইগউইন থেকে উইন্ডোজ ইভেন্ট লগটিতে লগ ইভেন্টগুলি নির্ভুলভাবে ঠেলে দেওয়া দরকার ছিল। আমি WEVL- তে থাকা বার্তাগুলি কাস্টম হতে চেয়েছিলাম, সঠিক প্রস্থান কোড, বিশদ, অগ্রাধিকার, বার্তা ইত্যাদি থাকতে পারে তাই এটি যত্ন নেওয়ার জন্য আমি একটু বাশ স্ক্রিপ্ট তৈরি করেছি। এখানে এটি গিটহাব, লজিট.শ এ রয়েছে

কিছু অংশ:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.