2013-03-19 2 views
6

मैं फ़ाइल से पथ पढ़ने और इसे पर्यावरण चर में सेट करने के लिए बैच फ़ाइल लिख रहा हूं। परिवर्तनीय प्राप्त करने के लिए इस बैच फ़ाइल का उपयोग कई अन्य बैच फ़ाइलों द्वारा किया जाएगा (कहा जाता है)। बैच फ़ाइल लिखते समय मुझे एक समस्या का सामना करना पड़ा, जो इस समस्या को दूर करने के लिए SETLOCAL ENABLEDELAYEDEXPANSION का उपयोग करता था। लेकिन ऐसा करने से अन्य बैच फाइलें इसका उपयोग कर रही हैं वे चर सेट करने में सक्षम नहीं हैं।बैच स्क्रिप्ट अन्य बैच फ़ाइलों द्वारा एक्सेस किए गए सेटलोकल चर को

नीचे बैच स्क्रिप्ट,

getVariables.bat 

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
    echo setting JAVA_HOME to :: !JAVA_HOME! 
    echo setting JAVA to !JAVA! 
) 

मेरी एक और बैच फ़ाइल में मैं ऊपर batach फ़ाइल उपयोग कर रहा हूँ चर सेट

another.bat 

    call getVariables.dat 
    echo "%JAVA%" 

प्राप्त करने के लिए है लेकिन गूंज "प्रिंट कर रहा है", जहां यह सेट नहीं है यदि यह setlocal की वजह से है, तो मैं इसे कैसे दूर कर सकता हूं? मुझे विस्तार में देरी और निष्पादन समय पर होने के लिए setlocal की भी आवश्यकता है। इस मुद्दे के लिए कोई समाधान? कृपया मेरी मदद करें।

उत्तर

4

यह endlocal & set str=value अद्भुत काम करेगा।

+1

यह मेरे साथ समस्या थी। मैं अपनी सभी स्क्रिप्ट में सेटलोकल का उपयोग करने की आदत में हूं। अंत में, मुझे एक अपवाद मिला जहां यह एक समस्या पैदा हुई। – djangofan

2

यह वास्तव में आप जो कर रहे हैं उस पर निर्भर करता है - और क्या आपने पूर्ण स्क्रिप्ट पोस्ट की है।

सबसे पहले, आप असंतुलित % में %test.dat

इसके बाद, यह नाम बैच फ़ाइलों के लिए एक अच्छा विचार है है .bat नहीं .dat

इसके बाद, अगर यह getVariables.bat का एकमात्र उद्देश्य चर का एक फ़ाइल fom स्थापित करने के लिए है लाइनों (test.dat)

JAVA_HOME=c:\whereverjavahomeis 
JAVA=c:\whereverjavais 
तो

की तरह

पूरी तरह से पर्याप्त है। बस हो गया - 4 लाइनों (और यदि आप वास्तव में कोशिश यह सब 1 के लिए सघन किया जा सकता है ...)

मुद्दा यह है कि आप केवल आदेश चर आप 'का मान प्रदर्शित करने के लिए enabledelayedexpansion और इसलिए setlocal की जरूरत है WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES बदल रहा है। आप अंततः उन पंक्तियों को हटा देंगे, और enabledelayedexpansion अपने राइसन डी एट्रे खो देता है।

परीक्षण के लिए, आप

@echo off 
echo before...JAVA=%java% 
echo before...JAVA_HOME=%java_home% 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
) 
echo after....JAVA=%java% 
echo after....JAVA_HOME=%java_home% 

या यहाँ तक कि

@echo off 
echo before&set java 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
) 
echo after&set java 

वास्तव में लिख सकता है, अगर getVariables.bat ही कभी CALL एड तो है भी @echo off लाइन निरर्थक है - आप यह सोचते हैं @echo off मार डाला गया है कॉलिंग बैच से।

10

स्थानीय चर का मान करने के लिए कई वैश्विक चर सेट करने के लिए निम्नलिखित चाल का उपयोग करें:

endlocal & (
    set "globalvar1=%localvar1%" 
    set "globalvar2=%localvar2%" 
    set "globalvar3=%localvar3%" 
) 

() ब्लॉक में चर से पहले endlocal निष्पादित किया जाता है का विस्तार कर रहे हैं।

0

cmd और खोज सेटएक्स में जाएं। यह आपको सिस्टम वैरिएबल और अन्य सभी प्रकार की चीजों को बनाने देता है जैसे फ़ाइल में एक चर के एक्स और वाई निर्देशांक भी ढूंढना।

संबंधित मुद्दे