0 पर त्रुटि की स्थापना


14

मेरे पास एक बैच फ़ाइल है जो एक इंस्टॉलर के आसपास एक आवरण है। यह बैच फ़ाइल इंस्टॉलर द्वारा लौटाए गए त्रुटि स्तर की जांच करती है और तदनुसार प्रिंट करती है।

मैंने देखा कि अगर मैं set ERRORLEVEL=0बैच फ़ाइल (उसी कमांड विंडो / वातावरण में) को बंद करने से पहले एक कमांड प्रॉम्प्ट में निष्पादित करता हूं , तो इंस्टॉलर कभी भी त्रुटि के साथ गड़बड़ नहीं करता है और मेरी बैच स्क्रिप्ट हमेशा वापस आ जाती है। मुझे लगता %ERRORLEVEL%है कि विंडोज द्वारा परिभाषित एक चर है और विशेष रूप से कार्यक्रमों और लिपियों से त्रुटियों को प्रिंट करने के लिए उपयोग किया जाता है और यह कि बैच फ़ाइल में चर का उपयोग करते हुए या कुछ और 'अपने जोखिम पर' होगा क्योंकि इसे किसी भी क्षण बदला जा सकता है एक और प्रक्रिया।

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


जवाबों:


14

आप सिस्टम चर को एक नियमित रूप से पुनर्परिभाषित कर रहे हैं। जब आप ऐसा करते हैं, तो कमांड सत्र बंद होने तक सिस्टम इसका उपयोग नहीं करेगा।

सबसे अच्छा तरीका उपयोग करना होगा

exit /b 0

किसी अन्य बैच फ़ाइल में और उसे अपनी प्राथमिक स्क्रिप्ट से कॉल करें। जहां 0 नंबर आपकी चाहत है errorlevel। या तो एक आदेश का उपयोग करें या जो errorlevelआपके लिए रीसेट करता है , जैसे कि प्रतिध्वनि, मज्जा आदि।

उदाहरण के लिए, निम्नलिखित कमांड्स ERRORLEVELआपके बैच-फाइल में 0 पर सेट होंगे :

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
लगभग सही है। आप बस का उपयोग कर किसी भी उपयोगकर्ता निर्धारित मान अपरिभाषित कर "प्रणाली" गतिशील ERRORLEVEL उपयोग करने के लिए प्राप्त कर सकते हैंset "errorlevel="
dbenham

विंडोज किसी को सिस्टम वेरिएबल को रेगुलर में बदलने की अनुमति क्यों देता है? क्या दोनों परिभाषाएँ अभी भी मौजूद हैं, इसकी सिर्फ प्रतिध्वनि और इस तरह के अन्य आदेश अब नियमित रूप से इंगित करते हैं? इसलिए प्रोग्राम अभी भी सिस्टम वेरिएबल को अपडेट कर सकते हैं, यह सिर्फ कमांड प्रॉम्प्ट के माध्यम से सुलभ नहीं है?
user972276

1
"या तो एक कमांड का उपयोग करें या जो आपके लिए एररवेले को रीसेट करता है, जैसे कि इको, फाउंडस्ट्र आदि।" इको कमांड एररवल वेरिएबल को रीसेट नहीं करता है ।
antred

जैसा कि दूसरों ने कहा है, यदि errorlevel चर को उपयोगकर्ता / बैच द्वारा "मैन्युअल रूप से" सेट किया गया है "set errorlevel=0", तो errorlevelचर अब बाहर निकलने वाले कोड को नहीं दिखाएगा, लेकिन आप अभी भी बाहर निकलने के कोड को एक्सेस कर सकते हैं if errorlevel do something
केविन फेगन

(१) एक और सामान्य प्रश्न है "मैं कुछ मनमाने मूल्य जैसे कि ४२ में त्रुटि कैसे निर्धारित करूं?"  cmd /c exit 42 लगता है कि सबसे अच्छा जवाब है। (२) जैसा कि  डेंभम बताते हैं , आपको /bया उद्धरणों की आवश्यकता नहीं है  ।
स्कॉट

12

आपको अपने स्वयं के मान को कभी भी डायनेमिक सिस्टम वैरिएबल जैसे ERRORLEVEL, PATH, CD, DATE, TIME, आदि पर असाइन नहीं करना चाहिए। ऐसा करने से कोड डायनेमिक मान को देखने से रोकेगा। आप केवल उपयोगकर्ता परिभाषित मूल्य को अपरिभाषित करके गतिशील मूल्य को पुनर्स्थापित कर सकते हैं। उदाहरण के लिए:

set "errorlevel="

यदि आप त्रुटि करने वाले को 0 पर बाध्य करना चाहते हैं, तो आप इस पूरी तरह से गैर-सहज ज्ञान युक्त, लेकिन बहुत प्रभावी वाक्यविन्यास का उपयोग कर सकते हैं (call ):। कॉल के बाद का स्थान महत्वपूर्ण है। यदि आप त्रुटी को 1 पर सेट करना चाहते हैं, तो आप उपयोग कर सकते हैं (call)। यह महत्वपूर्ण है कि कॉल के बाद कोई स्थान नहीं होना चाहिए।

(call)
echo %errorlevel%
(call )
echo %errorlevel%

एक अधिक सहज, लेकिन त्रुटि रहित सेट करने के लिए कम सुविधाजनक विधि एक बैच फ़ाइल में समर्पित सबरूटीन का उपयोग करना है:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

या यदि कमांड लाइन पर, आप उपयोग कर सकते हैं

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%

8

मैं व्यक्तिगत रूप से इसका उपयोग करता हूं:

cd .

यूनिक्स खोल में भी काम करता है।


लेकिन, यह थोड़ा तेज हो सकता है: type nul>nulक्योंकि प्रक्रिया मॉनिटर पीएस QueryDirectoryपर कॉल दिखाता है cd .: cd .यूनिक्स शेल में एक और अच्छा दुष्प्रभाव है। यदि यह मिटाए जाने से पहले खोला गया है, तो यह टर्मिनल में काम कर रहे निर्देशिका को पुनर्स्थापित करता है।
एंड्री

2

यहां ErrorLevelराज्य को रीसेट करने के कुछ अन्य तरीके दिए गए हैं , जो MS-DOS में भी काम करते हैं (कम से कम संस्करण 6.22 के लिए):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

एमएस-डॉस में केवल निम्नलिखित तरीके काम करते हैं:

command /? > nul

fc nul nul > nul

पूर्णता के लिए, यह ErrorLevelराज्य को 1Windows और MS-DOS दोनों के लिए मान्य करता है:

< nul find ""

1

यह केवल एक चीज है जो मैंने पाई है।

call (exit /b 0)

इसे एक ऐसी स्क्रिप्ट की आवश्यकता है जो 3 पार्टी स्क्रिप्ट का उपयोग करती है जो ERRORLEVEL का पता लगाती है, लेकिन त्रुटि स्तर को ठीक से रीसेट नहीं कर रही है।


0

ये भी काम करेंगे: (त्रुटि 1 पर सेट करता है)

विधि 1

color 00

विधि 2

echo A | find "B"

आप इसका उपयोग 1-26 त्रुटि करने के लिए भी कर सकते हैं:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.