मैंने कई अल्पविराम से अलग किए गए निर्देशिका पथों के साथ एक पर्यावरण चर सेट किया है और वर्तमान निर्देशिका को चर में अगली निर्देशिका पथ पर सेट करने के लिए के लिए लूप का उपयोग करता हूं। और मैं वर्तमान पथ प्राप्त करने का प्रयास करता हूं, लेकिन परिणाम के बारे में यह अजीब लगता है।

मैं निम्नलिखित कोड का उपयोग करने की कोशिश करता हूं:

set a=C:\test\A,C:\test\B,C:\test\C

for %%i in (%a%) do (
    echo %%i
    echo 1 %CD%
    cd %%i
    echo 2 %CD%
    echo ""
)

और परिणाम है:

 C:\test>TEST.BAT
 C:\test\A
 1 C:\test
 2 C:\test
 ""
 C:\test\B
 1 C:\test
 2 C:\test
 ""
 C:\test\C
 1 C:\test
 2 C:\test
 ""

 C:\test\C>

%CD% को cd %%i के बाद बदला जाना चाहिए। लेकिन सभी echo %CD% बैच फ़ाइल पथ C:\test को बैच फ़ाइल प्रारंभ करने पर वर्तमान निर्देशिका के रूप में आउटपुट करते हैं।

मैं सही वर्तमान पथ कैसे प्राप्त कर सकता हूं?

4
betty 5 अक्टूबर 2017, 09:12
यदि आप cd %%i के बाद अपने लूप में mkdir test जोड़ते हैं, तो आप देखेंगे कि आप अपने सबफ़ोल्डर में हैं, भले ही echo %CD% आपको बताए कि आप नहीं हैं; यह वाकई अजीब है
 – 
Will
5 अक्टूबर 2017, 09:22
9
%CD% को कमांड ब्लॉक में वर्तमान निर्देशिका स्ट्रिंग द्वारा प्रतिस्थापित किया जाता है जो ( से शुरू होता है और FOR कमांड के निष्पादित होने से पहले ) से मेल खाता है। आपको विलंबित विस्तार को सक्षम करना होगा और !CD! का उपयोग करना होगा। एक कमांड प्रॉम्प्ट विंडो set /? में चलाएँ और कई पृष्ठों पर संपूर्ण सहायता आउटपुट पढ़ें और विस्तार में देरी की व्याख्या भी करें। नोट: cd %%i अपेक्षा के अनुरूप काम कर रहा है, पर्यावरण चर संदर्भ पर विलंबित विस्तार का उपयोग न करने के कारण आपको वर्तमान निर्देशिका सही प्रदर्शित नहीं होती है।
 – 
Mofi
5 अक्टूबर 2017, 09:23

1 उत्तर

सबसे बढ़िया उत्तर

( से शुरू होने वाले और मिलान ) के साथ समाप्त होने वाले कमांड ब्लॉक में %variable% का उपयोग करने वाले सभी पर्यावरण चर संदर्भों को क्रमशः कमांड ब्लॉक से पहले संदर्भित पर्यावरण चर के वर्तमान मूल्य द्वारा विंडोज कमांड दुभाषिया द्वारा प्रतिस्थापित किया जाता है। कमांड ब्लॉक की शुरुआत के लिए बाएं कमांड को बिल्कुल निष्पादित किया जाता है।

इसका मतलब है कि पोस्ट की गई बैच फ़ाइल में के लिए लूप के लिए Windows कमांड दुभाषिया प्रीप्रोसेसिंग स्थिति के दौरान कोड को संशोधित करता है:

for %i in (C:\test\A C:\test\B C:\test\C) do (
echo %i
 echo 1 C:\test
 cd %i
 echo 2 C:\test
 echo ""
)

यह आउटपुट ठीक वैसे ही पोस्ट किया गया है जो बैच फ़ाइल को कमांड प्रॉम्प्ट विंडो के भीतर से चलाने पर देखा जा सकता है बजाय @echo off के साथ बैच फ़ाइल पर डबल क्लिक करने के लिए शीर्ष पर हटा दिया गया है या टिप्पणी की गई है या @echo on में संशोधित किया गया है।

कृपया ध्यान दें कि प्रत्येक अल्पविराम को निर्देशिकाओं की सूची में स्थान द्वारा प्रतिस्थापित किया जाता है, दोनों %CD% को C:\test द्वारा प्रतिस्थापित किया जा रहा है और संशोधित इंडेंटेशन।

फिर के लिए कमांड को इस प्रीप्रोसेस्ड कमांड ब्लॉक के साथ निष्पादित किया जाता है।

बैच फ़ाइल में कमांड cd %%i काम करते हैं, लेकिन पर्यावरण चर संदर्भों को निष्पादन से पहले ही चर CD के वर्तमान मान से बदल दिया जाता है जो कि यहां C:\test है।

FOR लूप के निष्पादन के दौरान वर्तमान निर्देशिका को देखने के लिए विलंबित परिवेश चर विस्तार की आवश्यकता है।

@echo off
setlocal EnableDelayedExpansion
set "DirectoryList=C:\test\A C:\test\B C:\test\C"

for %%I in (%DirectoryList%) do (
    echo %%I
    echo 1 !CD!
    cd /D %%I
    echo 2 !CD!
    echo/
)

rem Other commands in batch file perhaps using DirectoryList.
endlocal

लेकिन कृपया ध्यान रखें कि एक निर्देशिका/फ़ाइल नाम के अंदर एक विस्मयादिबोधक चिह्न की व्याख्या एक परिवर्तनीय संदर्भ के प्रारंभ/अंत के रूप में विलंबित पर्यावरण परिवर्तनीय विस्तार सक्षम होने पर की जाती है जिसके परिणामस्वरूप निष्पादन पर अप्रत्याशित व्यवहार हो सकता है।

प्रयुक्त कमांड को समझने के लिए और वे कैसे काम करते हैं, एक कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्नलिखित कमांड निष्पादित करें, और प्रत्येक कमांड के लिए प्रदर्शित सभी सहायता पृष्ठों को पूरी तरह से पढ़ें।

  • cd /?
  • echo /?
  • endlocal /?
  • for /?
  • rem /?
  • set /? ... एक IF और एक के लिए उदाहरण पर विलंबित पर्यावरण चर विस्तार की व्याख्या भी करता है।
  • setlocal /?

लेख भी देखें:

1
Mofi 28 जिंदा 2018, 17:05
समाधान के लिए धन्यवाद।
 – 
betty
5 अक्टूबर 2017, 12:56