Saturday 15 September 2012

Windows batch shift not working in if block -


जब मैं SHIFT को IF ब्लॉक के अंदर उपयोग करने का प्रयास करता हूं I मुझे कुछ अप्रत्याशित परिणाम दिखाई दे रहे हैं इसका प्रयोग:

  @echo बंद अगर "% 1" == "/ p" (प्रतिध्वनि% 1 बदलाव गूंज "स्थानांतरित" गूंज% 1)   

मुझे निम्नलिखित मिलता है:

  सी: \ & gt; ex.bat / p है / पी "स्थानांतरित" / p   

हालांकि, जब मैं उपयोग करता हूं इस कोड:

  @echo off गूंज% 1 पाली गूंज "स्थानांतरित" गूंज% 1   

मुझे यह मिलता है:

 < कोड> सी: \ & gt; ex.bat / p है / पी "स्थानांतरित" है   

मुझे दूसरे आउटपुट की आवश्यकता है, लेकिन एक तर्क ब्लॉक में तो मैं उस पर लूप कर सकता हूँ I मैं यहां जॉन के उत्तर के समान कुछ लागू करने की कोशिश कर रहा हूं :, लेकिन मुझे कुछ परेशानी हो रही है। ऐसा क्यों हो रहा है?

यह अपेक्षित व्यवहार है क्योंकि % 1 है विस्तारित किया जाता है जब रेखा को पार्स किया जाता है, और पूरे कोष्ठक के जरिए निर्मित एक पार में सभी पार्स किया जाता है तो आप SHIFT के नतीजे को तब तक नहीं देख सकते हैं जब तक कि कोई नई लाइन पार्स नहीं हो जाती, जो तब तक नहीं होगी जब तक कि आपने अपने कोष्ठक ब्लॉक नहीं छोड़े।

एक ही समस्या तब होती है जब % वर% । पर्यावरण चर के साथ आप SETLOCAL EnableDelayedExpansion का उपयोग करके विलंबित विस्तार को सक्षम करके और फिर ! Var! का उपयोग करके समस्या को प्राप्त कर सकते हैं। लेकिन विलम्बित विस्तार का उपयोग करके मापदंडों को विस्तृत करने के लिए कोई तुलनीय तरीका नहीं है।

संपादित करें 2013-06-21 - एक तुलनीय तरीका नहीं है, लेकिन एक सरल तरीका है अपेक्षाकृत धीमा है।

आप लाइन को कॉल का उपयोग करके और % को दोहरीकरण के लिए मजबूर कर सकते हैं।

  @echo off if " % 1 "==" / पी "(गूंज% 1 बदलाव गूंज" स्थानांतरित "कॉल गूंज %% 1)   



संपादित करें 2016-07-15 यह एक खराब अभ्यास है, क्योंकि यह दर्शाता है कि आप इसे छोड़ने के लिए GOTO का उपयोग करने के बाद कोड के एक ब्लॉक के भीतर वापस कूद सकते हैं। वह बस काम नहीं करता है गोटो तुरंत किसी भी पार्सेड कोड ब्लॉक को मारता है। आप के रूप में व्लादिस्लाव के कोड को भी लिखा हो सकता है:

  @echo बंद अगर "% 1" == "/ p" (गोटो: सच है: सच गूंज "% 1" बदलाव गूंज ने " % 1 ")   

यदि स्थिति गलत है, तो पूरे ब्लॉक को छोड़ दिया है। यदि हालत सच है, तो गोटो तुरंत ब्लॉक को मारता है, और फिर निष्पादन सामान्य रूप से ऊपर उठाता है: सही लेबल (कोई ब्लॉक संदर्भ नहीं)। अतिरिक्त ) अंत में बस अनदेखा किया जाता है।

ध्यान दें कि आप इस निर्माण के साथ एक ELSE नहीं जोड़ सकते। निम्नलिखित वांछित परिणाम नहीं देते:

  @echo बंद अगर "% 1" == "/ p" (गोटो: सच: सही गूंज "% 1" shift echo shift echo "% 1 ") अन्य (गूंज यह निष्पादित करेगा चाहे चाहे arg1 is / p है या नहीं)   

यदि गलत है, तो केवल ELSE ब्लॉक निष्पादित किया गया है। यदि सही है, तो शीर्ष ब्लॉक निष्पादित और तुरंत मार डाला है। कोड का शेष क्रियान्वयन किया जाता है, और ) अन्य ( लाइन को ध्यान नहीं दिया जाता है क्योंकि ) एक आरईएम के रूप में कार्य करता है अगर पार्सर कमांड की अपेक्षा कर रहा है और कोई सक्रिय कणों के ब्लॉक नहीं हैं स्टैक पर।

मैं दृढ़ता से अनुशंसा करता हूं कि आप कभी भी कोड के एक कोष्ठक ब्लॉक के भीतर लेबल नहीं लिखते हैं जैसा मैंने ऊपर दिखाया है (या व्लास्लाव ने किया है)।

नीचे एक बेहतर है (सरल और गुमराह करने वाला) एक ही काम करने का तरीका:

  @echo off अगर नहीं "% 1" == "/ p" गोटो: इको "% 1" को छोड़ें shift echo shifted echo "% 1":   

आप कुछ अतिरिक्त लेबल और जीओटीओ के साथ IF / THEN / ELSE अवधारणा का समर्थन कर सकते हैं

  @echo off if not "% 1 "==" / पी "गोटो: नो पी इको"% 1 "शिफ्ट एको स्थानांतरित एको"% 1 "गोटो: एंडआईएफ: नो पी इको नॉट / पी: एंडआईफ़    

No comments:

Post a Comment