2009-03-27 41 views
17

के लिए एक में प्रारंभ मैं एक बैच फ़ाइल जो पाश के लिए एक के अंदर सेट के माध्यम से चर initializes, डिस्क पर फ़ाइलों का एक सेट के लिए है:बैच फ़ाइल चर पाश

for %%f in (%MYTARGETDIR%\*config.xml) do (
    SET TMPFILE=%%F.tmp 

    echo In loop %TMPFILE% 
) 

echo End loop %TMPFILE% 

जब मैं एक ब्रांड के नए आदेश में इस चलाने खोल (बिना TMPFILE परिभाषित) इन लूप इको खाली है, लेकिन अंत लूप गूंज नहीं है।

जब मैं दूसरी बार चलाने के लिए, अपने पहले से ही निर्धारित करते हैं, और इसके मूल्य आउटपुट, सेट अनदेखी जब तक पाश बंद कर देता है।

विचार क्यों है, और क्या समाधान नहीं है?

उत्तर

9

क्योंकि() ब्लॉक केवल एक बार पार्स किया गया है है यही कारण है, यह% TMPFILE% से पहले ही अपने पाश चलाता विकल्प।

+1

धन्यवाद, मैंने अभी सेटलोकल ENABLEDELAYED EXPANSION – theschmitzer

21

रिकॉर्ड के लिए, को सही स्क्रिप्ट इस तरह दिखता है: आपकी मदद के लिए

setlocal ENABLEDELAYEDEXPANSION 

for %%f in (%MYTARGETDIR%\*config.xml) do (

    SET TMPFILE=%%F.tmp 

    echo In loop !TMPFILE! 
) 

echo End loop %TMPFILE% 

धन्यवाद क्रिस।

16

ऐसा इसलिए है क्योंकि कमांड पढ़ते समय पर्यावरण चर को प्रतिस्थापित किया जाता है। निम्न आदेश के लिए:

for %%f in (%mytargetdir%\*config.xml) do (
    set tmpfile=%%f.tmp 
    echo In loop %tmpfile% 
) 

पूरे आदेश (for से समापन कोष्ठक के लिए) पढ़ सकते हैं और क्रियान्वयन से पहले दिया जाता है।

आप इस तरह के साथ के रूप में देरी विस्तार, उपयोग करने की आवश्यकता:

@echo off 
    setlocal enableextensions enabledelayedexpansion 
    set full=/u01/users/pax 
:loop1 
    if not "!full:~-1!" == "/" (
     set full2=!full:~-1!!full2! 
     set full=!full:~,-1! 
     goto :loop1 
    ) 
    echo !full! 
    endlocal 

आप विस्तार में देरी सक्षम करते हैं, "%" मार्करों अभी भी पहले की कार्य लेकिन आप देरी विस्तार करने के लिए "!" मार्कर का उपयोग कर सकते हैं।

+2

देखा है आपका उदाहरण थोड़ा सा आसान हो सकता था :) – Lajcik

6

तुम भी देरी विस्तार के बजाय CALL SET उपयोग कर सकते हैं।

+0

वे अधिक पठनीय! –

2

आम तौर पर, मैं के साथ/ई CMD.EXE आह्वान: और/v पर: स्विच पर आदेश एक्सटेंशन सक्षम और चर विस्तार में देरी करने के लिए। फिर मेरे द्वारा उपयोग की जाने वाली किसी भी बैच स्क्रिप्ट को यह जांचने के लिए कोड किया जाता है कि देरी परिवर्तनीय विस्तार चालू है।

यह पहली बार मैं SETLOCAL लेने तर्कों के बारे में सुना है है। मैंने सेटोकल/के साथ जांच की? और यकीन है कि पर्याप्त! यह मेरे लिए ऐसा समय और कोड सेवर है।

हालांकि, मैंने नोट किया कि सीएमडी.एक्सईई में कमांड एक्सटेंशन सक्षम होना चाहिए इससे पहले कि सेटलोक ENABLEDELAYEDEXPANSION विकल्प को पहचान लेगा। यह सेटलोकल के आउटपुट से है?

If Command Extensions are enabled SETLOCAL changes as follows: 

SETLOCAL batch command now accepts optional arguments: 
     ENABLEEXTENSIONS/DISABLEEXTENSIONS 
      enable or disable command processor extensions. These 
      arguments takes precedence over the CMD /E:ON or /E:OFF 
      switches. See CMD /? for details. 
     ENABLEDELAYEDEXPANSION/DISABLEDELAYEDEXPANSION 
      enable or disable delayed environment variable 
      expansion. These arguments takes precedence over the CMD 
      /V:ON or /V:OFF switches. See CMD /? for details. 

इस मूल्यवान उत्तर के लिए धन्यवाद।