विंडोज़ बैच SET के अंदर अगर काम नहीं कर रहा है


102

जब मैं यह स्क्रिप्ट (.bat फ़ाइल से) चला रहा हूँ:

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

मुझे हमेशा मिलता है:

ECHO is on.

मतलब var2चर वास्तव में सेट नहीं था। किसी को भी कृपया मुझे समझने में मदद कर सकते हैं क्यों?

जवाबों:


184

var2 सेट है, लेकिन echo %var2%ब्लॉक में विस्तार ब्लॉक निष्पादित होने से पहले होता है।
इस समय var2खाली है।

इसलिए विलंबित विस्तारक सिंटैक्स मौजूद है, यह !इसके बजाय उपयोग करता है %और इसका मूल्यांकन निष्पादन समय पर किया जाता है, न कि पार्स समय।

कृपया ध्यान दें कि उपयोग करने के लिए !, अतिरिक्त विवरण setlocal EnableDelayedExpansionकी आवश्यकता है।

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
धन्यवाद, आपने मुझे बहुत बड़ा दर्द दिया है।
मैना

&और &&ऑपरेटरों के लिए एक ही नियम । यह कोड set x=some & set y=%x%thing & echo results %y%आउटपुट है %x%thing
ग्वार

13

मुझे पार्टी में थोड़ी देर हो गई है लेकिन इस स्थिति से निपटने का एक और तरीका है if, इस तरह से प्रक्रिया जारी रखना

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

या / और gotoवाक्यविन्यास का उपयोग करें

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

इस तरह से विस्तार "समय में" होता है और आपको इसकी आवश्यकता नहीं होती है setlocal EnableDelayedExpansion। नीचे पंक्ति, यदि आप अपनी स्क्रिप्ट के डिजाइन पर पुनर्विचार करते हैं तो आप इसे उसी तरह कर सकते हैं


मैं एक if स्टेटमेंट के अंदर बनाए गए वैरिएबल को एक्सेस करने में असमर्थ हूं। Var2 के साथ आपका पहला उदाहरण काम नहीं करता है।
एंटोनियोसीएस

@AntonioCS दिलचस्प ... यह सटीक स्क्रिप्ट है जिसे मैंने अभी परीक्षण किया है echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. और यह काम कर रहा है। "अगर आप बैच फ़ाइल में एक वैरिएबल बनाएंगे जिसे प्रोग्राम में कहीं भी एक्सेस किया जा सकता है।" aticleworld.com/batch-file-variables-and-scope
TS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.