एक असफल पुनर्निर्देशन (गैर-मौजूद फ़ाइल या अपर्याप्त फ़ाइल पहुँच के कारण) पर, ErrorLevel
मान सेट करने के लिए नहीं लगता है (निम्न उदाहरण में, फ़ाइल test.tmp
है लिखना-सुरक्षित और फाइल test.nil
मौजूद नहीं है):त्रुटि लेवल केवल के बाद क्यों सेट किया गया है || असफल पुनर्निर्देशन पर ऑपरेटर?
>>> (call) & rem // (reset `ErrorLevel`)
>>> > "test.tmp" echo Text
Access is denied.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
>>> (call) & rem // (reset `ErrorLevel`)
>>> < "test.nil" set /P DUMMY=""
The system cannot find the file specified.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
हालांकि, जैसे ही विफल रही पुनर्निर्देशन सशर्त संयोजन ऑपरेटर ||
है, जो बाहर निकलने के कोड से क्वेरी है द्वारा पीछा किया जाता, ErrorLevel
1
करने के लिए सेट हो जाता है, अप्रत्याशित रूप से:
>>> (call) & rem // (reset `ErrorLevel`)
>>> (> "test.tmp" echo Text) || echo Fail
Access is denied.
Fail
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=1
>>> (call) & rem // (reset `ErrorLevel`)
>>> (< "test.nil" set /P DUMMY="") || echo Fail
The system cannot find the file specified.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=1
दिलचस्प बात यह है ErrorLevel
रहता 0
जब ऑपरेटर &&
प्रयोग किया जाता है:
>>> (call) & rem // (reset `ErrorLevel`)
>>> (> "test.tmp" echo Text) && echo Pass
Access is denied.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
>>> (call) & rem // (reset `ErrorLevel`)
>>> (< "test.nil" set /P DUMMY="") && echo Pass
The system cannot find the file specified.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
ErrorLevel
ऑपरेटर &
का उपयोग कर भी 0
रहता है:
>>> (call) & rem // (reset `ErrorLevel`)
>>> (> "test.tmp" echo Text) & echo Pass or Fail
Access is denied.
Pass or Fail
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
>>> (call) & rem // (reset `ErrorLevel`)
>>> (< "test.nil" set /P DUMMY="") & echo Pass or Fail
The system cannot find the file specified.
Pass or Fail
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
दोनों सशर्त संयोजन ऑपरेटरों &&
और ||
दिखाई मामले में, ErrorLevel
सेट किया गया है 1
पर भी (यदि ||
&&
से पहले होता है, तो दोनों शाखाओं को निष्पादित किया जाता है पिछले उदाहरण है, लेकिन मैं यह सिर्फ इसलिए &&
पूर्ववर्ती echo
आदेश के निकास कोड) का मूल्यांकन करता है लगता है:
>>> (call) & rem // (reset `ErrorLevel`)
>>> (> "test.tmp" echo Text) && echo Pass || echo Fail
Access is denied.
Fail
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=1
>>> (call) & rem // (reset `ErrorLevel`)
>>> (< "test.nil" set /P DUMMY="") || echo Fail && echo Pass
The system cannot find the file specified.
Fail
Pass
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=1
तो ErrorLevel
मूल्य और ||
ऑपरेटर, क्यों ErrorLevel
||
से प्रभावित होता है के बीच संबंध क्या है? ||
बाहर निकलने के कोड को ErrorLevel
पर कॉपी कर रहा है? क्या यह सब केवल (असफल) पुनर्निर्देशन के साथ संभव है, क्योंकि किसी भी आदेश को निष्पादित करने से पहले इसे संभाला जाता है? &&
द्वारा ErrorLevel
0
को रीसेट किया जा रहा - -
इससे भी अधिक अजीब है, मैं विपरीत व्यवहार का पालन नहीं कर सकता है, सही ढंग से परीक्षण सेटअप को वापस लाने में जब (जो है, (call)
(call)
द्वारा की जगह (शुरू ErrorLevel
1
करने के लिए सेट करने के लिए), फ़ाइल test.tmp
की केवल पढ़ने के लिए विशेषता समाशोधन, फ़ाइल test.nil
(पहली पंक्ति खाली नहीं set /P
से बचने के लिए 1
को ErrorLevel
स्थापित करने के लिए) बनाने, और परीक्षण के लिए फाइल एक्सटेंशन .bat
बजाय .cmd
का उपयोग कर (set /P
से बचने के लिए ErrorLevel
0
को पुनर्स्थापित करने के लिए))।
मैं विंडोज 7 और विन्डोज़ 10
मैं एक siilar सवाल पूछने के रास्ते पर था जब मुझे पता चला कि इसमें से अधिकांश पहले से ही [dbenham द्वारा कवर किया गया था] (http: // stackoverflow।कॉम/ए/34 9 37706/6811411) – LotPings
एक डीबगर में सीएमडी चलाएं। मेरा जवाब यहां देखें http://stackoverflow.com/questions/38148571/vb6-debugging-compiled। 'x cmd। * 'इसमें' parse' और 'errorlevel' के साथ बहुत सारे फ़ंक्शन दिखाता है। –
यदि आपका प्रश्न है "यह क्यों होता है?", तो माइक्रोसॉफ्ट केवल जानता है ... इस व्यवहार को [इस उत्तर] पर दस्तावेज किया गया है (http://stackoverflow.com/questions/34987885/what-are-the-errorlevel-values -सेट-बाय-आंतरिक-cmd-exe-command/34987886 # 34987886), अन्य मामलों के अलावा जो त्रुटि मान भी इस तरह से लौटाते हैं; "बाहर निकलें कोड प्रबंधन (तालिका 5)" के लिए देखो। बीटीडब्लू, त्रुटि से 0 को रीसेट करने का एक आसान तरीका 'ver' कमांड के माध्यम से है ... – Aacini