चर में चर का उपयोग कैसे करें? यह कोड:
set newvar=%var%var2%%
काम नहीं करता है। इसलिए क्या करना है? मैं इसके बिना अपना कार्यक्रम नहीं लिख सकता।
चर में चर का उपयोग कैसे करें? यह कोड:
set newvar=%var%var2%%
काम नहीं करता है। इसलिए क्या करना है? मैं इसके बिना अपना कार्यक्रम नहीं लिख सकता।
जवाबों:
मैं AFH से सहमत हूं; आपको "डबल-पार्स" करने के लिए सीएमडी प्राप्त करना होगा set
बयान।
लेकिन मुझे ऐसा करने के लिए एक कीचड़ मिला है जिसमें एक अस्थायी बैच फ़ाइल शामिल नहीं है
(या जिसे आप चाहते हैं, उसे खोजने के लिए हर चर को देखते हुए)।
यह एक सबरूटीन और एक चाल का उपयोग करता है जिसे विलंबित चर विस्तार कहा जाता है।
जोड़कर विलंबित विस्तार सक्षम करें
setlocal enabledelayedexpansion
अपने बैच फ़ाइल की शुरुआत के पास कहीं।
विलंबित चर विस्तार का उद्देश्य कुछ जटिल है -
देख SET /?
तथा SETLOCAL /?
अधिक जानकारी के लिए -
लेकिन यह जानना महत्वपूर्ण है कि यह आपको चर का संदर्भ देता है
साथ में ! चर का नाम !
के अतिरिक्त % चर का नाम %
।
तो अब हम शुरू करें:
@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof
:kludge
set newvar=!%1!
exit /b
जब हम कूदते हैं :kludge
पहले बयान में तब्दील हो जाता है set newvar=!var2!
(इसलिये %1
, सबरूटीन के लिए पहला तर्क है var2
)
और फिर set newvar=orange
(जैसा कि बयान किया गया था set newvar=%var2%
)।
इसलिए newvar
के लिए तैयार हो जाता है orange
।
Btw, goto :eof
तथा exit /b
विनिमेय हैं।
यदि एक सबरूटीन के भीतर से बुलाया जाता है (यानी, कहीं आप एक के साथ मिला है call
बयान),
वे कॉल करने वाले की वापसी का कारण बनते हैं।
अन्यथा, वे बैच फ़ाइल के अंत में एक छलांग की तरह काम करते हैं, जिससे बैच की नौकरी होती है
माता-पिता, इंटरैक्टिव, कमांड प्रॉम्प्ट को उड़ाने के बिना समाप्त करने के लिए।
:kludge
दिनचर्या। आप बस उपयोग कर सकते हैं set "newvar=!var%A%!"
, जैसा कि मैंने में दिखाया मेरा जवाब ।
एक अपेक्षाकृत धीमी विधि। CALL कमांड चर विस्तार का एक अतिरिक्त स्तर प्रदान करता है। बाहरी चर नाम के चारों ओर के पर्चे को विस्तार में देरी करने के लिए दोगुना किया जाता है जब तक कि आंतरिक चर का विस्तार नहीं किया जाता है।
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
विलंबित विस्तार का उपयोग करने के लिए एक बेहतर तरीका है। इसे पहले SETLOCAL ENABLEDELAYEDEXPANSION के साथ सक्षम किया जाना चाहिए। पर्केंट्स के भीतर चर का विस्तार तब होता है जब लाइन पार्स होती है। विस्मयादिबोधक बिंदु के भीतर चर को पार्स करने के बाद विस्तारित किया जाता है, लाइन निष्पादित होने से पहले।
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
set newvar=%var!A!%
- इतना करीब, लेकिन कोई सिगार नहीं!
%var!A!%
विफल रहता है और !var%A%!
एक बार जब आप विभिन्न विस्तार चरणों के क्रम को जानते हैं तो काम बहुत सरल है।
आम तौर पर, मैं इस तरह के परिदृश्यों से बचने की कोशिश करूँगा। हालांकि यह संभव है, यह प्रदर्शनकर्ता से बहुत दूर है और या तो पढ़ने में बहुत आसान नहीं है - मूल रूप से आपको इसका आउटपुट पार्स करना होगा set
आदेश।
set index=9
set var9=Goal
echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%
delims
विभाजन% I% से पहले = और% J% बाद =, और = चर नाम AFAIK में नहीं हो सकता।
in (set var%index%)
कि मेरे सिर में चारों ओर अफरा-तफरी मची थी। एकमात्र स्थिति जहां आपका समाधान काम नहीं करेगा अगर मूल्य के साथ शुरू हुआ =
। मुझे यकीन नहीं है कि जब विलंबित विस्तार की शुरुआत की गई थी, लेकिन मुझे संदेह है कि डबल पेर्सेन्ट्स के साथ कॉल NT4 में काम करेगा।
आप एक% याद कर रहे हैं।
"newvar =% var1 %% var2%" सेट करें
ध्यान दें कि एक संस्करण शुरू होता है और एक% के साथ समाप्त होता है।
यह भी देखें: http://www.dostips.com/DtTipsStringManipulation.php
echo set newvar=%%var%var2%>temp.cmd
, फिर.\temp.cmd
। थोड़ा बेखबर, लेकिन यह काम करता है।