2009-05-18 14 views
14

के भीतर पर्यावरण चर सेट करने में विफल रहता है Baz के बजाय निम्न Windows बैच फ़ाइल आउटपुट FooBar क्यों है?बैच फ़ाइल सशर्त कथन

@echo off 
setlocal 

set _=Foo 
echo %_% 
set _=Bar 
if 1==1 (
    set _=Baz 
    echo %_% 
) 

अपने सिस्टम पर निर्गम (माइक्रोसॉफ्ट विंडोज एक्सपी [संस्करण 2600/05/01]) है:

Foo 
Bar 

अगर मैं सशर्त बयान, Foo और Baz की उम्मीद उत्पादन को दूर मनाया जाता है।

+0

http://stackoverflow.com/questions/305605/weird-scope-issue-in-bat-file –

उत्तर

28

क्या हो रहा है यह है कि एक पंक्ति पढ़ने पर परिवर्तनीय प्रतिस्थापन किया जाता है।

if 1==1 (
    set _=Baz 
    echo %_% 
) 

, एक "पंक्ति" है कि आप क्या सोचते हो सकता है के बावजूद: क्या आप को ध्यान में रखना विफल रहे हैं तथ्य यह है कि है। "%_%" का विस्तार set कथन से पहले किया गया है।

आपको जो चाहिए वह विस्तार में देरी हो रही है। मेरी कमांड स्क्रिप्ट्स में से प्रत्येक के बारे में "setlocal enableextensions enabledelayedexpansion" के साथ शुरू होता है ताकि cmd.exe की पूर्ण शक्ति का उपयोग किया जा सके।

तो स्क्रिप्ट के अपने संस्करण होगा:

@echo off 
setlocal enableextensions enabledelayedexpansion 

set _=Foo 
echo !_! 
set _=Bar 
if 1==1 (
    set _=Baz 
    echo !_! 
) 

endlocal 

यह सही "Foo", "Baz" बजाय "Foo", "Bar" उत्पन्न करता है।

+2

का डुप्लिकेट विस्तृत स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है कि मैं एक बार फिर इस सटीक सीमा के खिलाफ आ रहा हूं, लेकिन यहां एक अधिक प्रतिबंधित वातावरण में: http://stackoverflow.com/questions/879023/honoring-exit-codes-from-batch-files-invoked-by- msbuild दुर्भाग्य से मेरे पास कमांड एक्सटेंशन चालू करने की क्षमता नहीं है यदि मैं MSBuild 'Exec' कार्य का उपयोग कर रहा हूं ... hmmm ... –

3

कोशिश इस

@echo off 
setlocal 

set _=Foo 
echo %_% 
set _=Bar 
if "1" NEQ "2" goto end 
set _=Baz 
echo %_% 
:end 
4

इसका जवाब का जवाब रूप में ही है: Weird scope issue in batch file। अधिक जानकारी के लिए वहां देखें। मूल रूप से परिवर्तनीय विस्तार लाइन पढ़ने के समय पर किया जाता है, निष्पादन समय पर नहीं।