बैच फ़ाइल। चर में चर


2

चर में चर का उपयोग कैसे करें? यह कोड:

set newvar=%var%var2%%

काम नहीं करता है। इसलिए क्या करना है? मैं इसके बिना अपना कार्यक्रम नहीं लिख सकता।


मुझे लगता है कि मैं समझता हूं कि आप क्या चाहते हैं, और यदि ऐसा है तो नीचे दिए गए उत्तर गलत व्याख्या करते हैं: यदि मैं सही हूं, तो आप चाहते हैं var2 जैसे मान को रोकना , इसलिए आप यह चाहते हैं newvar की सामग्री के लिए सेट किया जाना है Vara । सीएमडी को डबल-पार्स बनाने का एकमात्र तरीका मुझे उपयोग करना है echo set newvar=%%var%var2%>temp.cmd, फिर .\temp.cmd। थोड़ा बेखबर, लेकिन यह काम करता है।
AFH

माफ़ करना @mihi - मुझे लगता है कि आपका जवाब यही काम करता है, लेकिन मैंने पहले यूज़बैक का सामना नहीं किया है, और मैं सिंटैक्स के माध्यम से ठीक से काम नहीं कर सकता। कम थकान होने पर मैं फिर से देखूंगा।
AFH

जवाबों:


0

मैं 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 बयान), वे कॉल करने वाले की वापसी का कारण बनते हैं। अन्यथा, वे बैच फ़ाइल के अंत में एक छलांग की तरह काम करते हैं, जिससे बैच की नौकरी होती है माता-पिता, इंटरैक्टिव, कमांड प्रॉम्प्ट को उड़ाने के बिना समाप्त करने के लिए।


विलंबित विस्तार के बारे में कुछ भी स्पष्ट नहीं है। यह cmd.exe की एक महत्वपूर्ण विशेषता है, और मुझे यह मेरे सभी मध्यवर्ती या उन्नत बैच लिपियों के लिए एक महत्वपूर्ण घटक लगता है। तुम्हारी कोई जरूरत नहीं है :kludge दिनचर्या। आप बस उपयोग कर सकते हैं set "newvar=!var%A%!", जैसा कि मैंने में दिखाया मेरा जवाब
dbenham

@ दांबेहैम: आपने मेरे मुंह से सही शब्द निकाले - मेरा जवाब एक कीचड़ है क्योंकि इसे एक बयान को निष्पादित करने के लिए एक उपखंड की आवश्यकता है।
Scott

1
मुझे अपनी पिछली टिप्पणी पर थोड़ा गुस्सा करना चाहिए। विलंबित विस्तार cmd.exe के किसी भी अन्य पहलू की तुलना में अधिक या कम कीचड़ नहीं है। कुछ लोग तर्क दे सकते हैं कि पूरा कमांड प्रोसेसर एक बड़े पैमाने पर कीचड़ के अलावा कुछ भी नहीं है, और कुछ मामलों में मैं सहमत होगा;
dbenham

2

एक अपेक्षाकृत धीमी विधि। 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%!"

हम्म। मैं चकरा गया हूं। सुपर उपयोगकर्ता के समय के टिकटों के अनुसार, मैंने अपना उत्तर पोस्ट करने से पहले आपको यह पोस्ट किया था - लेकिन अब से पहले इसे देखकर मुझे याद नहीं है।
Scott

@ सच - मेरा उत्तर वास्तव में यहाँ पर आपके साथ पोस्ट होने से लगभग 12 घंटे पहले आया है।
dbenham

खैर, शायद मुझे अपने ब्राउज़र या मेरे इंटरनेट कनेक्शन में कोई समस्या थी। मुद्दा यह है कि, मैंने आपके (बहुत ही सुरुचिपूर्ण) उत्तर से चोरी नहीं की है - यदि मैंने इसे नहीं देखा है, तो मैंने अपना पोस्ट नहीं किया है - और मैंने आपका उत्थान किया है। BTW, मैंने कोशिश की set newvar=%var!A!% - इतना करीब, लेकिन कोई सिगार नहीं!
Scott

1
@ सच - कोई चिंता नहीं है :-) इसके पीछे तर्क %var!A!% विफल रहता है और !var%A%! एक बार जब आप विभिन्न विस्तार चरणों के क्रम को जानते हैं तो काम बहुत सरल है।
dbenham

1

आम तौर पर, मैं इस तरह के परिदृश्यों से बचने की कोशिश करूँगा। हालांकि यह संभव है, यह प्रदर्शनकर्ता से बहुत दूर है और या तो पढ़ने में बहुत आसान नहीं है - मूल रूप से आपको इसका आउटपुट पार्स करना होगा 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%

आउच। इस तरह के काम करता है, लेकिन यह विफल हो सकता है अगर VAR1 और VAR10 की तलाश भी मौजूद है। यह बहुत अनुकूलित किया जा सकता है, और अधिक मूर्ख प्रमाण बनाया गया है। लेकिन बहुत बेहतर (और बहुत सरल) तरीके हैं।
dbenham

@dbenham जबकि मुझे यह स्वीकार करना होगा कि अन्य समाधान आसान हैं (लेकिन शायद NT4 में काम नहीं किया था, जो कि आखिरी OS था जहाँ मुझे बैच प्रोग्रामिंग के साथ अधिक संपर्क था - बाद में मैंने हमेशा vbs या PoSH का उपयोग करने की कोशिश की), मैं नहीं देखें क्यों VAR10 किसी भी समस्या का हो सकता है - delims विभाजन% I% से पहले = और% J% बाद =, और = चर नाम AFAIK में नहीं हो सकता।
mihi

माफ करना मेरा बुरा। आप बिल्कुल सही हैं। मैं उपयोग करने के अनुकूलन के साथ मिश्रित हो रहा था in (set var%index%) कि मेरे सिर में चारों ओर अफरा-तफरी मची थी। एकमात्र स्थिति जहां आपका समाधान काम नहीं करेगा अगर मूल्य के साथ शुरू हुआ =। मुझे यकीन नहीं है कि जब विलंबित विस्तार की शुरुआत की गई थी, लेकिन मुझे संदेह है कि डबल पेर्सेन्ट्स के साथ कॉल NT4 में काम करेगा।
dbenham

0

आप एक% याद कर रहे हैं।

"newvar =% var1 %% var2%" सेट करें

ध्यान दें कि एक संस्करण शुरू होता है और एक% के साथ समाप्त होता है।

यह भी देखें: http://www.dostips.com/DtTipsStringManipulation.php


आपको समझ नहीं आया ... ठीक है, मेरे पास कई var हैं: var1, var2, var3 आदि। मेरे पास भी var A है जो 1 से बराबर है ... मुझे newvar सेट करने की आवश्यकता है जो% var% a %% को बराबर करेगा उदाहरण अधिक स्पष्ट रूप से है:% var% a% कौशल% b %% (मुख्य संस्करण var1skill1, var2skill1 आदि है)
user339962
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.