हमने बैच स्क्रिप्ट के व्याकरण की जांच के लिए प्रयोग किए। हमने बैच और कमांड लाइन मोड के बीच अंतर की भी जांच की।
बैच लाइन पार्सर:
यहाँ बैच फ़ाइल लाइन पार्सर में चरणों का संक्षिप्त विवरण दिया गया है:
चरण 0) पढ़ें पंक्ति:
चरण 1) प्रतिशत विस्तार:
चरण 2) विशेष वर्णों की प्रक्रिया करें, टोकन करें, और कैश्ड कमांड ब्लॉक का निर्माण करें: यह एक जटिल प्रक्रिया है जो कि उद्धरण, विशेष वर्ण, टोकन परिसीमाक और कैरट पलायन जैसी चीजों से प्रभावित होती है।
चरण 3) पार्स कमांड (एस) को तब ही इको करें जब कमांड ब्लॉक के साथ शुरू नहीं हुआ था @
, और पूर्ववर्ती चरण की शुरुआत में ईसीएचओ चालू था।
चरण 4) %X
चर विस्तार के लिए: केवल तभी जब कोई फ़ॉर कमांड सक्रिय हो और डीओ के बाद आदेश संसाधित किए जा रहे हों।
चरण 5) विलंबित विस्तार: विलंबित विस्तार सक्षम होने पर ही
चरण 5.3) पाइप प्रसंस्करण: केवल अगर कमांड पाइप के दोनों ओर हैं
चरण 5.5) अतिरिक्त पुनर्निर्देशन:
चरण 6) CALL प्रसंस्करण / कैरेट दोहरीकरण: केवल यदि कमांड टोकन CALL है
चरण 7) निष्पादित करें: आदेश निष्पादित किया गया है
यहां प्रत्येक चरण के लिए विवरण दिए गए हैं:
ध्यान दें कि नीचे वर्णित चरण केवल एक मॉडल है कि बैच पार्सर कैसे काम करता है। वास्तविक cmd.exe आंतरिक इन चरणों को प्रतिबिंबित नहीं कर सकता है। लेकिन यह मॉडल बैच स्क्रिप्ट के व्यवहार की भविष्यवाणी करने में प्रभावी है।
चरण 0) लाइन पढ़ें: पहले के माध्यम से इनपुट लाइन पढ़ें <LF>
।
- कमांड के रूप में पार्स की जाने वाली लाइन को पढ़ते समय,
<Ctrl-Z>
(0x1A) को <LF>
(लाइनफेड 0x0A) के रूप में पढ़ा जाता है।
- जब GOTO या CALL एक के लिए स्कैन करते समय लाइनों को पढ़ता है: लेबल,
<Ctrl-Z>
को ही माना जाता है - इसे परिवर्तित नहीं किया जाता है<LF>
चरण 1) प्रतिशत विस्तार:
- एक डबल
%%
एक एकल द्वारा प्रतिस्थापित किया जाता है%
- बहस के विस्तार (
%*
, %1
, %2
, आदि)
- विस्तार
%var%
, अगर var मौजूद नहीं है, तो इसे कुछ नहीं के साथ बदलें
- विस्तार के
<LF>
भीतर पहली पंक्ति में पंक्ति को काट दिया जाता है%var%
- एक पूरी व्याख्या के लिए dbenham सेम थ्रेड: प्रतिशत चरण से इसका पहला भाग पढ़ें
चरण 2) विशेष वर्णों की प्रक्रिया करें, टोकन करें, और कैश्ड कमांड ब्लॉक का निर्माण करें: यह एक जटिल प्रक्रिया है जो कि उद्धरण, विशेष वर्ण, टोकन परिसीमाक और कैरट पलायन जैसी चीजों से प्रभावित होती है। इस प्रक्रिया का एक अनुमान क्या है।
ऐसी अवधारणाएं हैं जो इस चरण में महत्वपूर्ण हैं।
- एक टोकन केवल पात्रों का एक स्ट्रिंग है जिसे एक इकाई के रूप में माना जाता है।
- टोकन टोकन सीमांकक द्वारा अलग किए जाते हैं। मानक टोकन सीमांकक हैं
<space>
<tab>
;
,
=
<0x0B>
<0x0C>
और <0xFF>
लगातार टोकन सीमांकक को एक के रूप में माना जाता है - टोकन के बीच कोई खाली टोकन नहीं हैं
- एक उद्धृत स्ट्रिंग के भीतर कोई टोकन सीमांकक नहीं हैं। पूरे उद्धृत स्ट्रिंग को हमेशा एकल टोकन के हिस्से के रूप में माना जाता है। एक एकल टोकन में उद्धृत स्ट्रिंग्स और अनकोट्यूट वर्णों का संयोजन हो सकता है।
इस चरण में संदर्भ के आधार पर निम्नलिखित वर्णों का विशेष अर्थ हो सकता है: <CR>
^
(
@
&
|
<
>
<LF>
<space>
<tab>
;
,
=
<0x0B>
<0x0C>
<0xFF>
बाएं से दाएं प्रत्येक वर्ण देखें:
- यदि
<CR>
तब इसे हटा दें, जैसे कि यह कभी नहीं था (अजीब पुनर्निर्देशन व्यवहार को छोड़कर )
- यदि कोई कैरेट (
^
) है, तो अगला वर्ण बच जाता है, और भागने वाला कैरेट हटा दिया जाता है। बच गए पात्र सभी विशेष अर्थों (को छोड़कर <LF>
) को खो देते हैं ।
- यदि एक उद्धरण (
"
), उद्धरण ध्वज को टॉगल करें। यदि उद्धरण ध्वज सक्रिय है, तो केवल "
और <LF>
विशेष हैं। अन्य सभी वर्ण अपना विशेष अर्थ खो देते हैं, जब तक कि अगली बोली बोली को बंद न कर दे। समापन उद्धरण से बचना संभव नहीं है। सभी उद्धृत वर्ण हमेशा एक ही टोकन के भीतर होते हैं।
<LF>
हमेशा उद्धरण ध्वज को बंद कर देता है। अन्य व्यवहार संदर्भ के आधार पर भिन्न होते हैं, लेकिन उद्धरण कभी भी व्यवहार में परिवर्तन नहीं करते हैं <LF>
।
- भाग निकले
<LF>
<LF>
छीन लिया गया है
- अगला किरदार बच जाता है। यदि लाइन बफर के अंत में है, तो अगली पंक्ति को चरण 1 और 1.5 द्वारा पढ़ा और संसाधित किया जाता है और अगले चरित्र से बचने से पहले वर्तमान में जोड़ा जाता है। यदि अगला चरित्र है
<LF>
, तो इसे शाब्दिक माना जाता है, अर्थात यह प्रक्रिया पुनरावर्ती नहीं है।
<LF>
कोष्ठक के भीतर नहीं बच गए
<LF>
छीन लिया गया है और वर्तमान लाइन के पार्सिंग को समाप्त कर दिया गया है।
- लाइन बफ़र में किसी भी शेष वर्ण को केवल अनदेखा किया जाता है।
- के
<LF>
लिए एक में निहित बिना कोष्ठक ब्लॉक है
<LF>
में परिवर्तित हो जाता है <space>
- यदि पंक्ति बफ़र के अंत में है, तो अगली पंक्ति को वर्तमान में पढ़ा और जोड़ा जाता है।
<LF>
एक कोष्ठक कमांड ब्लॉक के भीतर
भाग गया
<LF>
में परिवर्तित किया जाता है <LF><space>
, और <space>
कमांड ब्लॉक की अगली पंक्ति के हिस्से के रूप में माना जाता है।
- यदि पंक्ति बफ़र के अंत में है, तो अगली पंक्ति को अंतरिक्ष में पढ़ा और जोड़ा जाता है।
- यदि विशेष वर्णों में से एक
&
|
<
या >
, इस बिंदु पर लाइन को विभाजित करें ताकि पाइप, कमांड कॉन्सेटेशन और पुनर्निर्देशन को संभाल सकें।
- पाइप (
|
) के मामले में , प्रत्येक पक्ष एक अलग कमांड (या कमांड ब्लॉक) है जिसे चरण 5.3 में विशेष हैंडलिंग मिलती है
- के मामले में
&
, &&
या ||
आदेश समादेश, समवर्ती के प्रत्येक पक्ष को एक अलग कमांड के रूप में माना जाता है।
- पुनर्निर्देशन खंड , के , या, पुनर्निर्देशन के मामले में
<
, अस्थायी रूप से हटा दिया गया है, और फिर वर्तमान कमांड के अंत में संलग्न है। पुनर्निर्देशन खंड में एक वैकल्पिक फ़ाइल हैंडल अंक, पुनर्निर्देशन ऑपरेटर और पुनर्निर्देशन गंतव्य टोकन होते हैं।
<<
>
>>
- यदि पुनर्निर्देशन ऑपरेटर से पहले का टोकन एक एकल न किया गया अंक है, तो वह अंक फ़ाइल हैंडल को पुनर्निर्देशित करने के लिए निर्दिष्ट करता है। यदि हैंडल टोकन नहीं मिला है, तो आउटपुट पुनर्निर्देशन डिफॉल्ट को 1 (स्टडआउट), और इनपुट रिडायरेक्शन डिफॉल्ट को 0 (स्टडिन) में बदल देता है।
- यदि इस कमांड के लिए पहले टोकन (अंत तक पुनर्निर्देशन करने से पहले) के साथ शुरू होता है
@
, तो @
इसका विशेष अर्थ है। ( @
किसी अन्य संदर्भ में विशेष नहीं है)
- विशेष
@
को हटा दिया जाता है।
- यदि ECHO चालू है, तो यह कमांड, इस लाइन पर किसी भी संक्षिप्त आदेश के साथ, चरण 3 इको से बाहर रखा गया है। यदि
@
उद्घाटन से पहले है (
, तो पूरे कोष्ठक को चरण 3 गूंज से बाहर रखा गया है।
- प्रक्रिया कोष्ठक (कई लाइनों में यौगिक कथनों के लिए प्रदान करता है):
- यदि पार्सर कमांड टोकन की तलाश में नहीं है, तो
(
विशेष नहीं है।
- यदि पार्सर एक कमांड टोकन की तलाश में है और पाता है
(
, तो एक नया यौगिक स्टेटमेंट शुरू करें और कोष्ठक काउंटर को बढ़ाएं
- यदि कोष्ठक काउंटर> 0 है तो
)
यौगिक विवरण को समाप्त करता है और कोष्ठक काउंटर को घटाता है।
- यदि पंक्ति का अंत हो गया है और कोष्ठक काउंटर> 0 है, तो अगली पंक्ति को यौगिक कथन से जोड़ा जाएगा (चरण 0 से फिर से शुरू होता है)
- यदि कोष्ठक काउंटर 0 है और पार्सर एक कमांड की तलाश में है, तो
)
एक REM
स्टेटमेंट के समान कार्य करता है जब तक कि एक टोकन सीमांकक, विशेष चरित्र, न्यूलाइन, या एंड-ऑफ-फाइल के तुरंत बाद होता है।
- सभी विशेष वर्ण अपना अर्थ खो देते हैं सिवाय
^
(रेखा समाकलन संभव है)
- एक बार तार्किक रेखा के अंत तक पहुंचने के बाद, पूरे "कमांड" को छोड़ दिया जाता है।
- प्रत्येक आदेश टोकन की एक श्रृंखला में पार्स किया जाता है। पहले टोकन को हमेशा एक कमांड टोकन के रूप में माना जाता है (विशेष
@
को छीन लिया गया है और पुनर्निर्देशन को अंत तक ले जाया गया है)।
- कमांड टोकन से पहले टोकन के सीमांकक छीन लिए जाते हैं
- जब कमांड टोकन को पार्स कर रहा
(
है, तो मानक टोकन सीमांकक के अलावा एक कमांड टोकन सीमांकक के रूप में कार्य करता है
- बाद के टोकन की हैंडलिंग कमांड पर निर्भर करती है।
- अधिकांश कमांड केवल एक ही तर्क टोकन में कमांड टोकन के बाद सभी तर्कों को संक्षिप्त करते हैं। सभी तर्क टोकन परिसीमन संरक्षित हैं। तर्क विकल्प आमतौर पर चरण 7 तक पार्स नहीं किए जाते हैं।
- तीन कमांड को विशेष हैंडलिंग मिलती है - आईएफ, फॉर, और आरईएम
- IF को दो या तीन अलग-अलग भागों में विभाजित किया जाता है जो स्वतंत्र रूप से संसाधित होते हैं। IF कंस्ट्रक्शन में एक सिंटैक्स त्रुटि के कारण एक घातक सिंटैक्स त्रुटि होगी।
- तुलना ऑपरेशन वास्तविक कमांड है जो चरण 7 के माध्यम से सभी तरह से बहती है
- चरण 2 में सभी IF विकल्प पूरी तरह से पार्स किए गए हैं।
- लगातार टोकन सीमांकक एक ही स्थान पर गिरते हैं।
- तुलना ऑपरेटर के आधार पर, पहचाने जाने वाले एक या दो मूल्य के टोकन होंगे।
- ट्रू कमांड ब्लॉक हालत के बाद कमांड का सेट है, और किसी भी अन्य कमांड ब्लॉक की तरह पार्स किया जाता है। यदि ईएलएसई का उपयोग किया जाना है, तो ट्रू ब्लॉक को कोष्ठक बनाना चाहिए।
- वैकल्पिक गलत कमांड ब्लॉक ELSE के बाद कमांड का सेट है। फिर, इस कमांड ब्लॉक को सामान्य रूप से पार्स किया जाता है।
- ट्रू और गलत कमांड ब्लॉक स्वचालित रूप से बाद के चरणों में प्रवाहित नहीं होते हैं। उनके बाद के प्रसंस्करण को चरण 7 द्वारा नियंत्रित किया जाता है।
- डीओ के बाद दो में विभाजित है। निर्माण में एक वाक्यविन्यास त्रुटि एक घातक वाक्यविन्यास त्रुटि के परिणामस्वरूप होगी।
- डीओ के माध्यम से भाग वास्तविक कमांड के लिए है जो चरण 7 के माध्यम से सभी तरह से बहती है
- सभी विकल्पों के लिए चरण 2 में पूरी तरह से पार्स किया गया है।
- कोष्ठक खंड में माना
<LF>
जाता है <space>
। IN क्लॉज़ को पार्स किए जाने के बाद, सभी टोकन एक साथ टोकन बनाने के लिए एक साथ सम्मिलित किए जाते हैं।
- डीओ के माध्यम से फ़ॉर कमांड के दौरान एक ही स्थान पर लगातार अनसुना / अनियोजित टोकन सीमांकक गिर जाते हैं।
- डीओ के बाद का भाग एक कमांड ब्लॉक है जिसे सामान्य रूप से पार्स किया जाता है। बाद में चरण 7 में डीओ कमांड ब्लॉक के प्रसंस्करण को नियंत्रित किया जाता है।
- चरण 2 में पाया गया रेम अन्य सभी कमांडों की तुलना में नाटकीय रूप से भिन्न माना जाता है।
- केवल एक तर्क टोकन को पार्स किया जाता है - पार्सर पहले तर्क टोकन के बाद वर्णों की उपेक्षा करता है।
- REM कमांड चरण 3 आउटपुट में दिखाई दे सकता है, लेकिन कमांड को कभी भी निष्पादित नहीं किया जाता है, और मूल तर्क पाठ को प्रतिध्वनित किया जाता है - बचने वाले कैरेट को हटाया नहीं जाता है, सिवाय ...
- यदि केवल एक तर्क टोकन है जो
^
लाइन को समाप्त करने वाले unescaped के साथ समाप्त होता है, तो तर्क टोकन को फेंक दिया जाता है, और बाद की रेखा को आरईएस में पार्स और जोड़ दिया जाता है। यह तब तक दोहराता है जब तक कि एक से अधिक टोकन न हों, या अंतिम वर्ण नहीं है ^
।
- यदि कमांड टोकन के साथ शुरू होता है
:
, और यह चरण 2 का पहला दौर है (चरण 6 में कॉल के कारण पुनरारंभ नहीं है) तो
- टोकन को आमतौर पर एक अनएक्सपेक्टेड लेबल के रूप में माना जाता है ।
- लाइन के शेष पार्स किया गया है, तथापि
)
, <
, >
, &
और |
अब विशेष अर्थ नहीं होता। लाइन के पूरे शेष को लेबल "कमांड" का हिस्सा माना जाता है।
^
विशेष होने के लिए, जिसका अर्थ है कि लाइन निरंतरता लेबल के लिए बाद में लाइन संलग्न करने के लिए इस्तेमाल किया जा सकता जारी है।
- एक कोष्ठबद्ध ब्लॉक के भीतर एक अस्पष्टीकृत लेबल एक घातक वाक्यविन्यास त्रुटि का परिणाम देगा जब तक कि इसे तुरंत अगली पंक्ति पर एक कमांड या निष्पादित लेबल द्वारा पालन नहीं किया जाता है ।
(
अनएक्सपेक्टेड लेबल का अनुसरण करने वाली पहली कमांड के लिए अब कोई विशेष अर्थ नहीं है ।
- लेबल पार्सिंग पूर्ण होने के बाद कमांड को निरस्त कर दिया जाता है। बाद के चरण लेबल के लिए जगह नहीं लेते हैं
- तीन अपवाद हैं जो चरण 2 में पाए जाने वाले लेबल को एक निष्पादित लेबल के रूप में माना जा सकता है जो चरण 7 के माध्यम से जारी रहता है।
- वहाँ पुनर्निर्देशन कि पछाड़ लेबल टोकन है, और वहाँ एक है
|
पाइप या &
, &&
या ||
लाइन पर आदेश संयोजन।
- पुनर्निर्देशन है जो लेबल टोकन से पहले है, और कमांड एक कोष्ठक के भीतर है।
- लेबल टोकन एक कोष्ठक ब्लॉक के भीतर एक लाइन पर पहली कमांड है, और ऊपर की रेखा एक अनएक्सपेक्टेड लेबल के साथ समाप्त हो गई है ।
- जब चरण 2 में एक निष्पादित लेबल खोजा जाता है, तो निम्न होता है
- चरण 3 में लेबल, इसके तर्क और इसके पुनर्निर्देशन को किसी भी प्रतिध्वनि आउटपुट से बाहर रखा गया है
- लाइन पर किसी भी बाद के समाप्त कमांड को पूरी तरह से पार्स और निष्पादित किया जाता है।
- के बारे में अधिक जानकारी के लिए निष्पादित लेबल बनाम बेरोज़गार लेबल , देख https://www.dostips.com/forum/viewtopic.php?f=3&t=3803&p=55405#p55405
चरण 3) पार्स कमांड (एस) को तब ही इको करें जब कमांड ब्लॉक के साथ शुरू नहीं हुआ था @
, और पूर्ववर्ती चरण की शुरुआत में ईसीएचओ चालू था।
चरण 4) %X
चर विस्तार के लिए: केवल तभी जब कोई फ़ॉर कमांड सक्रिय हो और डीओ के बाद आदेश संसाधित किए जा रहे हों।
- इस बिंदु पर, बैच प्रसंस्करण का चरण 1 पहले से ही एक परिवर्तनशील चर को जैसे
%%X
में बदल देगा %X
। चरण 1 के लिए कमांड लाइन के अलग-अलग प्रतिशत विस्तार नियम हैं। यही कारण है कि कमांड लाइन का उपयोग करते हैं, %X
लेकिन बैच फाइलें %%X
चर के लिए उपयोग करती हैं।
- चर नामों के लिए मामला संवेदनशील है, लेकिन
~modifiers
मामला संवेदनशील नहीं हैं।
~modifiers
चर नामों पर पूर्वता लें। यदि एक वर्ण निम्नलिखित में ~
से एक संशोधक और चर नाम के लिए मान्य है, और इसके बाद का वर्ण मौजूद है जो चर नाम के लिए एक सक्रिय है, तो चरित्र को एक संशोधक के रूप में व्याख्या की जाती है।
- परिवर्तनशील नाम वैश्विक हैं, लेकिन केवल डीओ क्लॉज के संदर्भ में हैं। अगर एक रूट को FOR DO क्लॉज़ के भीतर से कॉल किया जाता है, तो CALLed रूटीन में फ़ोर वेरिएबल्स का विस्तार नहीं किया जाता है। लेकिन अगर दिनचर्या अपनी ही के लिए आदेश है, तो सभी वर्तमान में चर के लिए परिभाषित भीतरी डीओ आदेशों के लिए उपलब्ध हैं।
- चर नामों के लिए नेस्टेड फ़ॉर्म्स के भीतर पुन: उपयोग किया जा सकता है। आंतरिक मूल्य के लिए पूर्वता है, लेकिन एक बार जब INNER बंद हो जाता है, तो बाहरी मूल्य के लिए बहाल हो जाता है।
- यदि ECHO इस चरण के प्रारंभ में चालू था, तो चरण 3) के लिए पार्स किए गए DO आदेशों को दर्शाने के बाद दोहराया जाता है।
---- इस बिंदु से, चरण 2 में पहचाने गए प्रत्येक कमांड को अलग से संसाधित किया जाता है।
---- चरण 5 से 7 के माध्यम से अगले पर जाने से पहले एक कमांड के लिए पूरा किया जाता है।
चरण 5) विलंबित विस्तार: केवल यदि विलंबित विस्तार चालू है, तो कमांड एक पाइप के दोनों ओर एक कोष्ठक खंड में नहीं है , और कमांड "नग्न" बैच स्क्रिप्ट नहीं है (बिना कोष्ठक के स्क्रिप्ट नाम, CALL, कमांड संघटन, या पाइप)।
- एक कमांड के लिए प्रत्येक टोकन को स्वतंत्र रूप से विलंबित विस्तार के लिए पार्स किया गया है।
- अधिकांश कमांड दो या दो से अधिक टोकन पार्स करते हैं - कमांड टोकन, तर्क टोकन और प्रत्येक पुनर्निर्देशन गंतव्य टोकन।
- आदेश के लिए केवल खंड टोकन में पार्स करता है।
- आईएफ कमांड तुलनात्मक ऑपरेटर के आधार पर तुलनात्मक मूल्यों को केवल एक या दो के आधार पर पार्स करता है।
- पार्स किए गए प्रत्येक टोकन के लिए, पहले जांचें कि क्या उसमें कोई है
!
। यदि नहीं, तो टोकन को पार्स नहीं किया गया है - ^
पात्रों के लिए महत्वपूर्ण है । यदि टोकन शामिल है !
, तो प्रत्येक वर्ण को बाएं से दाएं स्कैन करें:
- यदि यह एक कैरेट है (
^
) अगले चरित्र का कोई विशेष अर्थ नहीं है, तो कैरेट को हटा दिया जाता है
- यदि यह एक विस्मयादिबोधक चिह्न है, तो अगले विस्मयादिबोधक चिह्न की खोज करें (देखभाल अब नहीं देखी गई है), चर के मूल्य तक विस्तृत करें।
- लगातार उद्घाटन
!
एक एकल में ढह जाता है!
- किसी भी शेष अनपढ़
!
को हटा दिया जाता है
- इस स्तर पर वार्स विस्तार "सुरक्षित", अब और (यहां तक कि है, क्योंकि विशेष वर्ण का पता नहीं चलने
<CR>
या <LF>
)
- अधिक संपूर्ण स्पष्टीकरण के लिए, इस के 2 आधे भाग को डेंभम उसी थ्रेड से पढ़ें
- विस्मयादिबोधक बिंदु चरण
चरण 5.3) पाइप प्रसंस्करण: केवल तभी जब पाइप के दोनों ओर कमांड होते हैं पाइप के
प्रत्येक पक्ष को स्वतंत्र रूप से और अतुल्यकालिक रूप से संसाधित किया जाता है।
- यदि कमांड cmd.exe के लिए आंतरिक है, या यह एक बैच फ़ाइल है, या यदि यह एक कोष्ठक कमांड ब्लॉक है, तो इसे नए cmd.exe थ्रेड के माध्यम से निष्पादित किया
%comspec% /S /D /c" commandBlock"
जाता है, इसलिए कमांड ब्लॉक को एक चरण पुनरारंभ होता है, लेकिन इस बार कमांड लाइन मोड में।
- यदि एक कोष्ठक कमांड कमांड ब्लॉक करता है, तो
<LF>
पहले और बाद में एक कमांड के साथ सभी को परिवर्तित किया जाता है <space>&
। अन्य <LF>
छीन लिए गए हैं।
- यह पाइप कमांड के लिए प्रोसेसिंग का अंत है।
- देखें कि कोड के पाइप ब्लॉक के अंदर विस्तार में देरी क्यों विफल हो जाती है? पाइप पार्सिंग और प्रसंस्करण के बारे में अधिक जानकारी के लिए
चरण 5.5) निष्पादित पुनर्निर्देशन: चरण 2 में खोजे गए किसी भी पुनर्निर्देशन को अब निष्पादित किया गया है।
चरण 6) कॉल प्रोसेसिंग / कैरेट दोहरीकरण: केवल यदि कमांड टोकन कॉल है, या यदि पहले होने वाला मानक टोकन सीमांकक से पहले पाठ कॉल है। यदि CALL को एक बड़े कमांड टोकन से पार्स किया जाता है, तो अप्रयुक्त भाग को आगे बढ़ने से पहले टोकन के तर्कों के लिए तैयार किया जाता है।
- एक निर्विवाद के लिए तर्क टोकन को स्कैन करें
/?
। यदि टोकन के भीतर कहीं भी पाया जाता है, तो चरण 6 को निरस्त करें और चरण 7 पर जाएं, जहां कॉल के लिए हेल्प मुद्रित की जाएगी।
- पहले निकालें
CALL
, इसलिए कई कॉल को स्टैक किया जा सकता है
- डबल सभी देखभाल
- चरण 1, 1.5 और 2 को फिर से शुरू करें, लेकिन चरण 3 में जारी न रखें
- जब तक वे उद्धृत नहीं किए जाते हैं तब तक किसी भी दोहरी देखभाल को एक कैरेट में वापस घटाया जाता है। लेकिन दुर्भाग्य से, उद्धृत देखभाल दोगुनी है।
- चरण 1 थोड़ा बदलता है
- चरण 1.2 या 1.3 में विस्तार त्रुटियां कॉल को रोकती हैं, लेकिन त्रुटि घातक नहीं है - बैच प्रसंस्करण जारी है।
- चरण 2 कार्यों को थोड़ा बदल दिया जाता है
- कोई भी नया दिखने वाला, बिना लिखा हुआ पुनर्निर्देशन जो चरण 2 के पहले दौर में नहीं पाया गया था, का पता लगाया गया है, लेकिन इसे हटा दिया गया है (फ़ाइल नाम सहित) वास्तव में पुनर्निर्देशन किए बिना
- किसी भी नव दिखाई देने वाले, पंक्ति के अंत में बिना सहेजे हुए लापरवाह लाइन निरंतरता के प्रदर्शन के बिना हटा दिया जाता है
- CALL को त्रुटि के बिना निरस्त किया जाता है यदि निम्न में से किसी का पता लगाया जाता है
- नवनियुक्त दिखाई दे रहा है, अधूरा
&
या|
- परिणामी कमांड टोकन की शुरुआत बिना पढ़े, बिना पढ़े के साथ होती है
(
- हटाए गए CALL के साथ बहुत पहले टोकन शुरू हुआ
@
- यदि परिणामी कमांड एक उचित रूप से मान्य IF या FOR है, तो निष्पादन बाद में एक त्रुटि के साथ विफल होगा जो यह बताता है कि
IF
या FOR
आंतरिक या बाहरी कमांड के रूप में मान्यता प्राप्त नहीं है।
- बेशक CALL चरण 2 के इस 2 राउंड में निरस्त नहीं होता है यदि परिणामी कमांड टोकन एक लेबल शुरुआत है
:
।
- यदि परिणामी कमांड टोकन CALL है, तो चरण 6 को फिर से शुरू करें (तब तक दोहराएं जब तक कोई CALL नहीं)
- यदि परिणामी कमांड टोकन एक बैच स्क्रिप्ट या a: लेबल है, तो CALL का निष्पादन पूरी तरह से चरण 6 के शेष भाग द्वारा नियंत्रित किया जाता है।
- कॉल स्टैक पर वर्तमान बैच स्क्रिप्ट फ़ाइल स्थिति को पुश करें ताकि CALL पूरा होने पर निष्पादन सही स्थिति से फिर से शुरू हो सके।
- सभी परिणामी टोकन का उपयोग करके CALL के लिए% 0,% 1,% 2, ...% N और% * तर्क टोकन सेट करें
- यदि कमांड टोकन एक लेबल है जो इसके साथ शुरू होता है
:
, तो
- चरण 5 को पुनरारंभ करें। यह प्रभावित कर सकता है क्या: लेबल को कॉल किया गया है। लेकिन चूँकि% 0 आदि टोकन पहले ही सेटअप हो चुके हैं, इसलिए यह उन तर्कों को नहीं बदलेगा, जिन्हें CALLed रूटीन में पास किया गया है।
- GOTO लेबल को उप-आरंभ की शुरुआत में फ़ाइल पॉइंटर की स्थिति के लिए लेबल करें (किसी भी अन्य टोकन की अनदेखी करें: लेबल का पालन कर सकते हैं) GOTO कैसे काम करता है इसके नियमों के लिए चरण 7 देखें।
- निर्दिष्ट बैच स्क्रिप्ट के लिए स्थानांतरण हस्तांतरण नियंत्रण।
- CALLed का निष्पादन: लेबल या स्क्रिप्ट तब तक जारी रहता है जब तक कि EXIT / B या एंड-ऑफ-फ़ाइल नहीं पहुंच जाता है, जिस बिंदु पर CALL स्टैक पॉप होता है और सहेजे गए फ़ाइल स्थिति से निष्पादन फिर से शुरू होता है।
चरण 7 को स्क्रिप्टेड स्क्रिप्ट या लेबल के लिए निष्पादित नहीं किया गया है।
- चरण 6 का परिणाम निष्पादन के लिए चरण 7 में आता है।
चरण 7) निष्पादित करें: आदेश निष्पादित किया गया है
- 7.1 - आंतरिक कमांड को निष्पादित करें - यदि कमांड टोकन उद्धृत किया गया है, तो इस चरण को छोड़ दें। अन्यथा, एक आंतरिक कमांड को पार्स करने और निष्पादित करने का प्रयास करें।
- निम्न परीक्षण यह निर्धारित करने के लिए किए जाते हैं कि क्या एक निर्विवाद कमांड टोकन एक आंतरिक कमांड का प्रतिनिधित्व करता है:
- यदि कमांड टोकन वास्तव में आंतरिक कमांड से मेल खाता है, तो इसे निष्पादित करें।
- पहले की घटना होने से पहले कमांड का टोकन टूट जाता है
+
/
[
]
<space>
<tab>
,
;
या =
यदि पूर्ववर्ती पाठ एक आंतरिक कमांड है, तो उस कमांड को याद रखें
- यदि कमांड लाइन मोड में, या यदि कमांड एक कोष्ठककृत ब्लॉक से है, यदि सही या गलत कमांड ब्लॉक, डीओ कमांड ब्लॉक के लिए, या कमांड कॉन्टेनेशन के साथ शामिल है, तो आंतरिक कमांड निष्पादित करें
- एल्स (बैच मोड में एक स्टैंड-अलोन कमांड होना चाहिए) एक .COM, .EXE, .BAT, या .CMD फ़ाइल के लिए वर्तमान फ़ोल्डर और PATH को स्कैन करता है जिसका आधार नाम मूल कमांड टोकन से मेल खाता है।
- यदि पहली मिलान फ़ाइल एक .BAT या .CMD है, तो गोटो 7.3.exec और उस स्क्रिप्ट को निष्पादित करें
- एल्स (मिलान नहीं मिला या पहला मैच .EXE या .COM) याद किए गए आंतरिक कमांड को निष्पादित करता है
- पहले की घटना से पहले कमांड टोकन को तोड़ देता है
.
\
या :
यदि पूर्ववर्ती पाठ एक आंतरिक कमांड नहीं है, तो गोटो 7.2
पूर्ववर्ती पाठ एक आंतरिक आदेश हो सकता है। इस कमांड को याद रखें।
- की पहली घटना से पहले कमांड टोकन को तोड़ दें
+
/
[
]
<space>
<tab>
,
;
या =
यदि पूर्ववर्ती पाठ एक मौजूदा फ़ाइल के लिए एक पथ है, तो गोटो 7.2
एल्स याद किए गए आंतरिक कमांड को निष्पादित करता है।
- यदि एक आंतरिक कमांड को एक बड़े कमांड टोकन से पार्स किया जाता है, तो कमांड टोकन का अप्रयुक्त भाग तर्क सूची में शामिल होता है
- सिर्फ इसलिए कि एक कमांड टोकन को आंतरिक कमांड के रूप में पार्स किया जाता है, इसका मतलब यह नहीं है कि यह सफलतापूर्वक निष्पादित होगा। प्रत्येक आंतरिक कमांड के अपने नियम होते हैं कि कैसे तर्कों और विकल्पों को पार्स किया जाता है, और किस सिंटैक्स की अनुमति है।
- यदि सभी आंतरिक आदेशों
/?
का पता लगाने के बजाय उनके कार्य को करने में मदद करेगा । अधिकांश /?
यह तर्क में कहीं भी प्रकट होता है, तो पहचानें । लेकिन ECHO और SET जैसे कुछ कमांड केवल प्रिंट मदद करते हैं यदि पहला तर्क टोकन शुरू होता है /?
।
- सेट के कुछ दिलचस्प शब्दार्थ हैं:
- यदि SET कमांड में चर नाम और एक्सटेंशन सक्षम होने से पहले एक उद्धरण है
set "name=content" ignored
-> मान = content
तो पहले बराबर चिह्न और अंतिम उद्धरण के बीच के पाठ का उपयोग सामग्री के रूप में किया जाता है (पहले बराबर और अंतिम उद्धरण को बाहर रखा गया है)। अंतिम उद्धरण के बाद पाठ को अनदेखा किया जाता है। यदि समान चिह्न के बाद कोई उद्धरण नहीं है, तो बाकी पंक्ति सामग्री के रूप में उपयोग की जाती है।
- यदि SET कमांड में नाम से पहले कोई उद्धरण नहीं है
set name="content" not ignored
-> मान = "content" not ignored
तो समतुल्य के बाद की शेष रेखा सामग्री के रूप में उपयोग की जाती है, जिसमें कोई भी और सभी उद्धरण शामिल हो सकते हैं।
- एक IF तुलना का मूल्यांकन किया जाता है, और यह इस बात पर निर्भर करता है कि स्थिति सही है या गलत, चरण 5 के साथ शुरू होने वाले उपयुक्त पहले से ही निर्भर आश्रित कमांड ब्लॉक को संसाधित किया जाता है।
- एक आदेश का खंड उचित रूप से iterated है।
- यदि यह एक FOR / F है जो कमांड ब्लॉक के आउटपुट को पुनरावृत्त करता है, तो:
- IN क्लॉज को CMD / C के माध्यम से एक नई cmd.exe प्रक्रिया में निष्पादित किया जाता है।
- कमांड ब्लॉक को दूसरी बार पूरी पार्सिंग प्रक्रिया से गुजरना होगा, लेकिन इस बार कमांड लाइन के संदर्भ में
- ECHO चालू हो जाएगा, और विलंबित विस्तार आमतौर पर अक्षम होना शुरू हो जाएगा (रजिस्ट्री सेटिंग पर निर्भर)
- एक बार चाइल्ड cmd.exe प्रक्रिया समाप्त होने पर IN क्लॉज कमांड ब्लॉक द्वारा किए गए सभी पर्यावरण परिवर्तन समाप्त हो जाएंगे
- प्रत्येक पुनरावृत्ति के लिए:
- परिवर्तनशील मानों के लिए परिभाषित किया गया है
- चरण 4 के साथ शुरू होने वाले पहले से ही पार्स डीओ कमांड ब्लॉक को संसाधित किया जाता है।
- GOTO: लेबल का पता लगाने के लिए निम्न तर्क का उपयोग करता है
- लेबल को पहले तर्क टोकन से पार्स किया गया है
- लेबल की अगली घटना के लिए स्क्रिप्ट स्कैन की जाती है
- स्कैन वर्तमान फ़ाइल स्थिति से शुरू होता है
- यदि फ़ाइल का अंत पहुँच जाता है, तो स्कैन फ़ाइल की शुरुआत में वापस लूप करता है और मूल शुरुआती बिंदु पर जारी रहता है।
- स्कैन उस लेबल की पहली घटना पर रुक जाता है, जिसे वह पाता है, और फ़ाइल पॉइंटर लेबल के तुरंत बाद लाइन पर सेट हो जाता है। स्क्रिप्ट का निष्पादन उस बिंदु से शुरू होता है। ध्यान दें कि एक सफल असली GOTO कोड के किसी भी ब्लॉक किए गए ब्लॉक को तुरंत लूप सहित निरस्त कर देगा।
- यदि लेबल नहीं मिला है, या लेबल टोकन गायब है, तो GOTO विफल रहता है, एक त्रुटि संदेश मुद्रित होता है, और कॉल स्टैक पॉप होता है। यह प्रभावी रूप से एक EXIT / B के रूप में कार्य करता है, GOTO का पालन करने वाले वर्तमान कमांड ब्लॉक में किसी भी पहले से मौजूद कमांड को अभी भी निष्पादित किया जाता है, लेकिन CALLer के संदर्भ में (संदर्भ जो EXIT / B के बाद मौजूद है)
- पार्सिंग लेबल के लिए उपयोग किए जाने वाले नियमों के अधिक सटीक विवरण के लिए https://www.dostips.com/forum/viewtopic.php?f=3&t=3803 देखें ।
- RENAME और COPY दोनों वाइल्डकार्ड को स्रोत और लक्ष्य पथ के लिए स्वीकार करते हैं। लेकिन Microsoft एक भयानक काम का दस्तावेजीकरण करता है कि वाइल्डकार्ड कैसे काम करते हैं, खासकर लक्ष्य पथ के लिए। वाइल्डकार्ड नियमों का एक उपयोगी सेट पाया जा सकता है कि विंडोज रेनैम कमांड वाइल्डकार्ड की व्याख्या कैसे करता है?
- 7.2 - परिमाण मात्रा में परिवर्तन - यदि कमांड टोकन एक उद्धरण के साथ शुरू नहीं होता है, तो ठीक दो वर्ण लंबा है, और दूसरा वर्ण बृहदान्त्र है, फिर मात्रा बदलें
- सभी तर्क टोकन की अनदेखी की जाती है
- यदि पहले वर्ण द्वारा निर्दिष्ट वॉल्यूम नहीं मिल सकता है, तो एक त्रुटि के साथ गर्भपात करें
- एक कमांड के टोकन
::
हमेशा एक त्रुटि में परिणाम जब तक SUBST के लिए एक मात्रा को परिभाषित करने के लिए किया जाता है जाएगा ::
तो SUBST के लिए एक मात्रा को परिभाषित करने के लिए किया जाता है ::
, तो मात्रा बदल जाएगा, यह एक लेबल के रूप में नहीं माना जाएगा।
- .३ - बाहरी आदेश का पालन करें - आदेश को बाहरी आदेश के रूप में मानने का प्रयास करें।
- कमांड लाइन मोड और आदेश में उद्धृत नहीं किया गया है और एक मात्रा विनिर्देश, सफेद-अंतरिक्ष से शुरू नहीं होता,
,
, ;
, =
या +
तो आदेश की पहली आवृत्ति पर टोकन तोड़ने <space>
,
;
या =
और टोकन (रों) तर्क को शेष पहले जोड़ें।
- यदि कमांड टोकन का दूसरा वर्ण एक बृहदान्त्र है, तो सत्यापित करें कि 1 वर्ण द्वारा निर्दिष्ट वॉल्यूम पाया जा सकता है।
यदि वॉल्यूम नहीं मिल सकता है, तो एक त्रुटि के साथ गर्भपात करें।
- यदि बैच मोड और कमांड टोकन के साथ शुरू होता है
:
, तो गोटो 7.4
नोट करें कि यदि लेबल टोकन के साथ शुरू होता है ::
, तो यह नहीं पहुंचेगा क्योंकि पूर्ववर्ती चरण एक त्रुटि के साथ समाप्त हो जाएगा जब तक कि SUBST का उपयोग किसी वॉल्यूम को परिभाषित करने के लिए नहीं किया जाता है ::
।
- निष्पादित करने के लिए बाहरी कमांड को पहचानें।
- यह एक जटिल प्रक्रिया है जिसमें वर्तमान मात्रा, वर्तमान निर्देशिका, पथ चर, पथ चर और फ़ाइल संघ शामिल हो सकते हैं।
- यदि एक वैध बाहरी कमांड की पहचान नहीं की जा सकती है, तो एक त्रुटि के साथ गर्भपात करें।
- यदि कमांड लाइन मोड में और कमांड टोकन के साथ शुरू होता है
:
, तो गोटो 7.4
ध्यान दें कि यह शायद ही कभी पहुंचता है क्योंकि पूर्ववर्ती कदम एक त्रुटि के साथ समाप्त हो जाएगा जब तक कि कमांड टोकन शुरू नहीं होता है ::
, और SUBST का उपयोग किसी वॉल्यूम को परिभाषित करने के लिए किया जाता है ::
, और संपूर्ण कमांड टोकन बाहरी कमांड का एक वैध मार्ग है।
- 7.3.exec - बाहरी कमांड निष्पादित करें।
- .४ - एक लेबल को अनदेखा करें - कमांड टोकन शुरू होने पर कमांड और उसके सभी तर्कों को अनदेखा करें
:
।
7.2 और 7.3 में नियम एक लेबल को इस बिंदु तक पहुंचने से रोक सकते हैं।
कमांड लाइन पार्सर:
इसके अलावा बैचलाइन-पार्सर की तरह काम करता है:
चरण 1) प्रतिशत विस्तार:
- नहीं
%*
, %1
आदि तर्क विस्तार
- यदि var अपरिभाषित है, तो
%var%
अपरिवर्तित छोड़ दिया जाता है।
- की कोई विशेष हैंडलिंग नहीं
%%
। यदि var = सामग्री है, तो %%var%%
विस्तार करता है %content%
।
चरण 3) पार्स की गई कमांड को प्रतिध्वनित करें
- यह चरण 2 के बाद नहीं किया जाता है। यह केवल FOR DO कमांड ब्लॉक के लिए चरण 4 के बाद किया जाता है।
चरण 5) विलंबित विस्तार: केवल तभी विलंबित विस्तार सक्षम है
- यदि var अपरिभाषित है, तो
!var!
अपरिवर्तित छोड़ दिया जाता है।
चरण 7) एक्सक्यूट कमांड
- CALL या GOTO का प्रयास: एक त्रुटि में लेबल परिणाम।
- जैसा कि पहले ही चरण 7 में प्रलेखित है, एक निष्पादित लेबल के परिणामस्वरूप विभिन्न परिदृश्यों में त्रुटि हो सकती है।
- बैच निष्पादित लेबल केवल एक त्रुटि का कारण बन सकते हैं यदि वे शुरू करते हैं
::
- कमांड लाइन निष्पादित लेबल लगभग हमेशा एक त्रुटि का परिणाम है
पूर्णांक मानों की पार्सिंग
कई अलग-अलग संदर्भ हैं जहां cmd.exe तार से पूर्णांक मानों को पार्स करता है, और नियम असंगत हैं:
SET /A
IF
%var:~n,m%
(चर विकल्प का विस्तार)
FOR /F "TOKENS=n"
FOR /F "SKIP=n"
FOR /L %%A in (n1 n2 n3)
EXIT [/B] n
CMD.EXE पार्स नंबरों की संख्या के लिए इन नियमों के विवरण नियमों पर पाए जा सकते हैं
Cmd.exe पार्सिंग नियमों में सुधार करने के इच्छुक किसी भी व्यक्ति के लिए, DosTips फ़ोरम पर एक चर्चा का विषय है जहाँ मुद्दों की सूचना दी जा सकती है और सुझाव दिए जा सकते हैं।
आशा है कि यह
जन एरिक (जेईबी) - मूल लेखक और चरणों के
खोजकर्ता डेव बेन्हम (debham) में मदद करता है - बहुत अधिक सामग्री और संपादन