मैं .NET में कंसोल एप्लिकेशन के निकास कोड को कैसे निर्दिष्ट करूं?


471

मैं .NET में एक तुच्छ सांत्वना अनुप्रयोग है। यह एक बड़े आवेदन का सिर्फ एक परीक्षण हिस्सा है। मैं अपने कंसोल एप्लिकेशन के "निकास कोड" को निर्दिष्ट करना चाहूंगा। मैं यह कैसे करु?

जवाबों:


599

3 विकल्प:

  • Mainयदि आप अपनी Mainविधि को वापस करने की घोषणा करते हैं तो आप इसे वापस कर सकते हैं int
  • आप कॉल कर सकते हैं Environment.Exit(code)
  • आप गुणों का उपयोग करके निकास कोड सेट कर सकते हैं Environment.ExitCode = -1;:। इसका उपयोग तब किया जाएगा जब कोई और रिटर्न कोड सेट नहीं करता है या ऊपर दिए गए अन्य विकल्पों में से एक का उपयोग करता है)।

आपके एप्लिकेशन (कंसोल, सर्विस, वेब ऐप आदि) के आधार पर विभिन्न तरीकों का इस्तेमाल किया जा सकता है।


12
आप में से जो आश्चर्य करते हैं कि यह उनके मामले में काम क्यों नहीं करता है, सुनिश्चित करें कि आपका प्रोजेक्ट "कंसोल एप्लिकेशन" के रूप में संकलित किया गया है न कि "विंडोज एप्लिकेशन" के रूप में।
मार्सेल गोसलिन

9
क्या होगा अगर मेरे पास कोई WinForms ऐप है जो कुछ आर्ग्स के साथ मैं चाहता हूं कि यह एक कंसोल ऐप के रूप में व्यवहार करे?
sebagomez

5
आप केवल maine प्रोग्राम को int के रूप में टाइप कर सकते हैं (int द्वारा शून्य को बदलें) और उदा। "वापसी -1;" मुख्य कार्यक्रम से लौटने के लिए। यह पर्यावरण से अधिक पोर्टेबल है। एक्सिट () (जो पर्यावरण पर निर्भर करता है)।
वर्नर

14
@DannyBeckett सम्मेलन के अनुसार, 0सफलता का एक निकास कोड और गैर-शून्य का मतलब विफलता है। return;एक्जिट कोड के माध्यम से सफलता का संकेत देता है 0, और return -1;विफलता का संकेत देता है।
एलोहनीडा

6
आप संपत्तियों का उपयोग करके निकास कोड भी सेट कर सकते हैं: पर्यावरण। ExitCode = -1;
t3b4n

270

जवाब के अलावा रिटर्न इंट कवर ... पवित्रता के लिए एक दलील। कृपया, यदि उचित हो तो फ्लैग के साथ, कृपया अपने एग्जिट कोड को एनम में परिभाषित करें। यह डिबगिंग और रखरखाव को इतना आसान बना देता है (और, एक बोनस के रूप में, आप अपनी सहायता स्क्रीन पर आसानी से बाहर निकलने वाले कोड को प्रिंट कर सकते हैं - आपके पास उनमें से एक है, ठीक है?)।

enum ExitCode : int {
  Success = 0,
  InvalidLogin = 1,
  InvalidFilename = 2,
  UnknownError = 10
}

int Main(string[] args) {
   return (int)ExitCode.Success;
}

46
आप जोड़ना चाह सकते हैं, कि "सफलता" के लिए "0" का मूल्य संयोग से नहीं है, लेकिन वास्तव में उस स्थिति के लिए "मानक" मूल्य है।
क्रिश्चियन.के।

39
इस। यही कारण है कि इंटरनेट के इतिहास में SO सबसे बड़ी वेबसाइट है। यह सलाह किसी भी पाठ्यपुस्तक में आसानी से उपलब्ध नहीं है, और केवल अनुभवी पेशेवर से बात करके ही इसे चमकाया जा सकता है। धन्यवाद।
डैनियल ज़ैबाबो

17
आप कहते हैं कि 0 सफलता के लिए मानक मूल्य है, और फिर भी 0/1 को बूलियन में परिवर्तित करते समय, 0 गलत है और 1 सत्य है! यह कहना अधिक सटीक हो सकता है कि 0 का एक एक्जिट कोड का अर्थ "कोई त्रुटि नहीं" है, बल्कि "सफलता" का, क्योंकि एग्जिट कोड एक ErrorResult है जिसका परिणाम केवल परिणाम नहीं है।
मार्क शापिरो

11
Microsoft कन्वेंशन की पूरी सूची के लिए, msdn.microsoft.com/en-us/library/windows/desktop/… देखें । कुछ लोगों ने कॉन्स्ट्स की एक विशाल सूची बनाई है और इसे नीचे दिए गए टिप्पणियों में स्विच केस में उपयोग किया है।
नवाफाल

5
@MarkShapiro, मुझे लगता 0 = Successहै कि इस तथ्य से आता है कि केवल एक ही सफलता कोड की आवश्यकता है, लेकिन कई त्रुटि कोड, जैसे कि 0, कंप्यूटर पूर्णांकों में कोई + या - के रूप में, विशिष्ट रूप से सफलता की पहचान करने के लिए इस्तेमाल किया जा सकता है
सेबस्टार

49

तीन तरीके हैं जो आप कंसोल एप्लिकेशन से निकास कोड वापस करने के लिए उपयोग कर सकते हैं।

  1. संशोधित Mainअपने आवेदन में विधि इतना है कि यह एक रिटर्न intके बजाय void(एक समारोह है कि रिटर्न एक Integerके बजाय SubVB.Net में) और फिर उस विधि से बाहर निकलने के कोड लौटाते हैं।
  2. बाहर निकलने के कोड के लिए Environment.ExitCode गुण सेट करें । ध्यान दें कि विधि 1. पूर्वता लेती है - यदि Mainविधि इसके अलावा void( SubVB.Net में एक ) है तो इस संपत्ति के मूल्य को नजरअंदाज कर दिया जाएगा।
  3. पर्यावरण के लिए बाहर निकलें कोड पास करें । विधि से बाहर निकलें । यह अन्य दो विधियों के विपरीत प्रक्रिया को तुरंत समाप्त कर देगा।

एक महत्वपूर्ण मानक जो देखा जाना चाहिए वह है 0'सफलता'।

संबंधित विषय पर, निकास कोड को परिभाषित करने के लिए गणना का उपयोग करने पर विचार करें कि आपका आवेदन वापस आने वाला है। FlagsAttribute आप कोड का एक संयोजन वापस जाने के लिए अनुमति देगा।

इसके अलावा, सुनिश्चित करें कि आपका आवेदन एक 'कंसोल एप्लीकेशन' के रूप में संकलित है।


1
यह एक दिलचस्प बिंदु लाता है। सेटिंग Environment.ExitCodeप्रोग्राम को तुरंत बंद नहीं करता है, लेकिन Environment.Exitविधि प्रोग्राम को तुरंत बंद कर देती है
साइकोडेटा

1
एग्जिट कोड विंडोज़ एप्लिकेशन पर भी काम करता है। यदि एप्लिकेशन को किसी Processऑब्जेक्ट के माध्यम से c # से प्रारंभ किया जाएगा , तो आप ऑब्जेक्ट से पूछ सकते हैं WaitForExit(), और फिर उससे बाहर निकलने का कोड अनुरोध कर सकते हैं ।
Nyerguds

43

यदि आप डेविड द्वारा सुझाई गई विधि का उपयोग करने जा रहे हैं, तो आपको [झंडे] विशेषता को भी देखना चाहिए।

यह आपको एनमों पर बिट वार ऑपरेशन करने की अनुमति देता है।

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

फिर

(ExitCodes.SignFailed | ExitCodes.UnknownError)

16 + 32 होगा। :)


3
इसका तात्पर्य यह है कि एक कार्यक्रम यह कहेगा कि 'आपका पासवर्ड गलत है' तो कोशिश करें और जो भी हस्ताक्षर कर रहा है उस पर हस्ताक्षर करें, और केवल तभी रुकें जब वह विफल हो। असफल होने पर आपको वापस लौट जाना चाहिए; कुछ और एक चेतावनी है और कार्यक्रम अभी भी वापस आ जाना चाहिए
पीट किर्कम

3
थोड़ा ज्ञात तथ्य यह है कि [झंडे] बिटवाइज़ संचालन को सक्षम या अक्षम करने के लिए कुछ भी नहीं करता है। यह सब करता है ToString विधि को ओवरराइड करता है ताकि आउटपुट बिटवाइज़ फ़्लैग का प्रतिनिधित्व करे। इसके साथ या इसके बिना, आप अभी भी बिटवाइज़ ऑपरेशन कर सकते हैं।
स्टीवन

3
@ पता है कि अच्छा है, लेकिन मैं अभी भी उस विशेषता के साथ "झंडा उपयोग" के लिए इरादा enums सजाने की सलाह दूंगा, अगर यह और कुछ नहीं इरादा है।
मारियोडीएस

25
int code = 2;
Environment.Exit( code );

17
कोई भी तकनीकी कारण जो आपने अभी नहीं लिखा है, "पर्यावरण। एक्ज़िट (2);" ?
Blorgbeard

52
एक जादुई संख्या को एक चर नाम के साथ एक निरर्थक नाम के साथ असाइन करना इसे कोई कम जादू नहीं बनाता है।
Blorgbeard


11

बस मुख्य से appropiate कोड वापस।

int main(string[] args)
{
      return 0; //or exit code of your choice
}

2
डिफ़ॉल्ट C # कंसोल ऐप मुख्य रूप से घोषित नहीं करता है। यह घोषणा करता है static void Main(string[] args);
मार्क लक्ता जूल

19
@ मर्क लकटा: फिर इसे बदलो, नहीं?
एस्टेबन अरया

11

यदि आपके मुख्य में शून्य रिटर्न हस्ताक्षर हैं, तो एक्ज़िटकोड का उपयोग करें, अन्यथा आपको उस मूल्य को "सेट" करना होगा जो आप वापस करते हैं।

पर्यावरण। एक्सिटकोड संपत्ति

यदि मुख्य विधि शून्य हो जाती है, तो आप इस संपत्ति का उपयोग बाहर निकलने वाले कोड को सेट करने के लिए कर सकते हैं जो कॉलिंग वातावरण में वापस आ जाएगी। यदि मेन शून्य नहीं लौटता है, तो इस संपत्ति को अनदेखा कर दिया जाता है। इस संपत्ति का प्रारंभिक मूल्य शून्य है।


8

स्कॉट मुनरो के जवाब के अपडेट के रूप में :

  • C # 6.0 और VB.NET 14.0 (VS 2015) में, या तो एनवायरनमेंट .ExitCode या एन्वायर्नमेंट.Exit (एक्ज़िटकोड) को एक कंसोल एप्लीकेशन से नॉन-जीरो कोड वापस करना आवश्यक है। रिटर्न प्रकार बदलने से Mainकोई प्रभाव नहीं पड़ता है।
  • एफ # 4.0 (वीएस 2015) में, mainप्रवेश बिंदु का रिटर्न मान सम्मान है।

क्या C # 6 के संबंध में आपकी पहली बात सत्यापित की जा सकती है? मुझे ऑनलाइन कुछ भी नहीं मिल रहा है। मुख्य फ़ंक्शन से वापसी मान प्रक्रिया के निकास कोड से जुड़ा हुआ है (कम से कम सभी पिछले कंपाइलरों में), उन्हें क्यों बदलना चाहिए?
बजे अरमान मैकहिटेरियन

शुद्ध वास्तविक सबूत, लेकिन मैं सिर्फ अपनी खुद की लाइब्रेरी में इस में भाग गया, जहां से कॉलिंग एप्लिकेशन द्वारा देखे गए परिणाम के रूप में मेरे परिणाम / त्रुटि कोड को Main()वापस नहीं किया Process.ExitCode
मार्कस मैंगल्सडॉर्फ

MSDN प्रतियोगिता int Mainअभी भी पर्यावरण के लिए एक विकल्प के रूप में इस्तेमाल किया जा सकता है। ExitCode। लिंक
अरमान मैकहिटेरियन

मेरे पास एक एप्लिकेशन है जो कई थ्रेड चलाता है। कुछ परिस्थितियों में, मुझे एप्लिकेशन से बाहर निकलने से पहले थ्रेड.एबोर्ट () के माध्यम से कुछ थ्रेड्स को बंद करने की आवश्यकता है। इन परिस्थितियों में, इंट मेन () {... थ्रेड.बोर्ट (); ... वापसी 0;} 0 से बाहर निकलने की प्रक्रिया में परिणाम नहीं करता है: प्रक्रिया से बाहर निकलने का कोड -1 है। ऐसा लगता है कि कुछ परिस्थितियों में, एमएस ने फैसला किया है कि प्रक्रिया के निकास कोड को निर्धारित करने के लिए मुख्य थ्रेड के रिटर्न वैल्यू का उपयोग करने का सम्मेलन उनके लिए पर्याप्त नहीं है। निष्पक्षता में, यह एक समय का मुद्दा हो सकता है: थ्रेड एबॉर्ट खेल में बहुत देर से निकास कोड सेट कर सकता है।
डेविड आई। मैकिन्टोश

7

गणना विकल्प उत्कृष्ट है लेकिन संख्याओं को गुणा करके इसमें सुधार किया जा सकता है:

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

कई त्रुटियों के मामले में, विशिष्ट त्रुटि संख्याओं को एक साथ जोड़ने से आपको एक अनूठी संख्या मिलेगी जो पता की गई त्रुटियों के संयोजन का प्रतिनिधित्व करेगी।

उदाहरण के लिए, 6 का एक त्रुटिवृत्त केवल 4 और 2 से मिलकर बना हो सकता है, 12 में केवल 4 और 8 शामिल हो सकते हैं, 14 में केवल 2, 4 और 8 आदि शामिल हो सकते हैं।


2
यह है कि अगर आप एक मुठभेड़ के बाद आगे त्रुटियों के लिए जाँच करने के लिए परेशान है, यद्यपि। अधिकांश ऐप्स नहीं हैं।
Nyerguds 10

3

मेरे 2 सेंट:

आप सिस्टम त्रुटि कोड यहां पा सकते हैं: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

आपको "फ़ाइल नहीं मिली" के लिए 2 या "एक्सेस अस्वीकृत" के लिए 5 जैसे विशिष्ट कोड मिलेंगे।

और जब आप किसी अज्ञात कोड पर ठोकर खाते हैं, तो आप इस कमांड का उपयोग यह पता लगाने के लिए कर सकते हैं कि इसका क्या मतलब है:

net helpmsg decimal_code

जैसे

शुद्ध helpmsg १

रिटर्न

गलत समारोह


0

इस कोड का उपयोग करें

Environment.Exit(0);

यदि आप कुछ भी वापस नहीं करना चाहते हैं तो 0 का उपयोग करें।


यह ओपी के सवाल का जवाब नहीं दे रहा है और 0 वापस लौट रहा है ...
पीएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.