कॉल या गोटो का लक्ष्य ब्रांड्स के भीतर ब्लॉक स्टेटमेंट के अंदर कभी नहीं होना चाहिए। यह किया जा सकता है, लेकिन जैसा कि आप देखते हैं, परिणाम शायद आप जो चाहते हैं वह नहीं होने जा रहे हैं।
संपूर्ण आईएफ (...) ईएलएसई (...) निर्माण को किसी भी संसाधित होने से पहले पार्स किया गया है और स्मृति में लोड किया गया है। दूसरे शब्दों में, यह तर्कसंगत रूप से कोड की एक पंक्ति के रूप में माना जाता है। इसे पार्स करने के बाद, सीएमडी.एक्सईई आईएफ/ईएलएसई निर्माण के बाद अगली पंक्ति के साथ शुरू होने वाली पार्सिंग फिर से शुरू करने की उम्मीद कर रहा है।
पार्स चरण के बाद, जटिल आदेश स्मृति से निष्पादित किया जाता है। आईएफ खंड ठीक से संसाधित किया जाता है और ईएलएसई खंड ठीक से छोड़ दिया जाता है। लेकिन IF (सत्य) खंड के भीतर, आप GOTO :asdf
निष्पादित करते हैं, इसलिए CMD.EXE ड्यूटीफली लेबल के लिए स्कैनिंग शुरू करता है। यह आईएफ/ईएलएसई के अंत में शुरू होता है और फ़ाइल के निचले भाग तक स्कैन करता है, शीर्ष पर वापस लूप करता है, और जब तक यह लेबल नहीं पाता तब तक स्कैन करता है। लेबल आपके आईएफ क्लॉज के भीतर होता है, लेकिन लेबल स्कैनर उस विवरण के बारे में कुछ भी नहीं जानता है। तो जब जटिल कमांड स्मृति से निष्पादित करता है, तो बैच प्रोसेसिंग जटिल IF/ELSE के अंत से लेबल से फिर से शुरू होता है।
तो इस बिंदु पर बैच प्रोसेसर देखता है और अगले कुछ लाइनों
echo baz
) else (
echo quux
)
baz गूँजती है निष्पादित करता है, और इसलिए quux है। लेकिन आप पूछ सकते हैं, "क्यों ) else (
नहीं है और/या )
में सिंटेक्स त्रुटि उत्पन्न बाद से वे अब असंतुलित और अब बड़ा अगर बयान के भाग के रूप में पार्स कर रहे हैं?
क्योंकि कैसे )
नियंत्रित किया जाता है की है कि।
यदि वहाँ एक खुला (
सक्रिय जब )
का सामना करना पड़ा है, तो )
के रूप में आप उम्मीद करेंगे संसाधित किया जाता है।
लेकिन पार्सर एक कमांड की उम्मीद है और एक )
पाता है जब वहाँ नहीं है एक सक्रिय खुला (
जाता है, फिर )
को अनदेखा किया गया है और रेखा के शेष भाग पर सभी वर्णों को अनदेखा कर दिया गया है! प्रभावी रूप से )
अब एक आरईएम कथन के रूप में काम कर रहा है।
+1 अच्छा स्पष्टीकरण, डेव। एक छोटा सा यह है: जब 'GOTO' निष्पादित किया जाता है * सक्रिय * 'FOR/IF' आदेश रद्द कर दिया जाता है और बैच फ़ाइल लेबल से जारी होती है। – Aacini