मेरे पास बहुत ही सरल बैच फ़ाइलों के दो उदाहरण हैं:
किसी वैरिएबल पर मान निर्दिष्ट करना:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
जो, उम्मीद के मुताबिक, परिणाम:
FOO: 1
Press any key to continue . . .
हालाँकि, अगर मैं एक ही दो लाइनों को IF IF DEFINED ब्लॉक के अंदर रखता हूँ:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
यह अप्रत्याशित रूप से परिणाम:
FOO:
Press any key to continue . . .
यह IF के साथ कुछ भी नहीं करना चाहिए , स्पष्ट रूप से ब्लॉक निष्पादित किया जा रहा है। यदि मैं BAR को ऊपर से परिभाषित करता हूं, तो, PAUSE कमांड से केवल पाठ प्रदर्शित होता है, जैसा कि अपेक्षित था।
क्या देता है?
सवाल का पालन करें: क्या सेटेलोकल के बिना विलंबित विस्तार को सक्षम करने का कोई तरीका है?
अगर मुझे इस सरल उदाहरण बैच फ़ाइल को दूसरे के अंदर से कॉल करना था, तो उदाहरण FOO सेट करता है, लेकिन केवल LOCALLY।
उदाहरण के लिए:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
यह प्रदर्शित करता है:
FOO: 1
FOO:
Press any key to continue . . .
इस मामले में, ऐसा प्रतीत होता है कि मुझे CALLER में विलंबित विस्तार को सक्षम करना है, जो एक परेशानी हो सकती है।
!
, तो इसका उपयोग करें^^^!
(दो बार बच जाएं)। अन्यथा "विलंबित विस्तार" सुविधा इसे खा जाएगी।