batch-file
बैच फ़ाइलों में चर
खोज…
घोषणा
एक साधारण चर बनाने के लिए और इसे एक मान या स्ट्रिंग पर SET
करने के लिए SET
कमांड का उपयोग करें:
SET var=10
यहां, कोड 10
मान के साथ एक नया चर var
घोषित करता है। डिफ़ॉल्ट रूप से सभी चर को आंतरिक रूप से तार के रूप में संग्रहीत किया जाता है; इसका मतलब है कि मान 10
foo1234
या Hello, World!
से अलग नहीं है Hello, World!
उद्धरण चिह्नों के बारे में नोट्स
उपयोग किए जाने वाले उद्धरण चिह्नों को चर के मूल्य में शामिल किया जाएगा:
SET var="new value" <-- %var% == '"new value"'
चर में रिक्त स्थान
बैच भाषा रिक्त स्थान को चर नामों का स्वीकार्य भाग मानती है। उदाहरण के लिए, set var = 10
एक चर बुलाया में परिणाम होगा var
कि मान 10
(ध्यान दें वर के अधिकार के लिए अतिरिक्त जगह और 10 के बाएं)।
रिक्त स्थान को खत्म करने के लिए उद्धरण चिह्नों का उपयोग करना
रिक्त स्थान को रोकने के लिए, पूरे असाइनमेंट के आसपास उद्धरण चिह्नों का उपयोग करें; चर नाम और मूल्य। यह पंक्ति के अंत में आकस्मिक अनुगामी रिक्त स्थान को रोकता है ( ␣
वर्ण किसी स्थान को दर्शाता है):
SET␣var=my␣new␣value␣ <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣ <-- '%var%' == 'my new value'
इसके अलावा, उद्धरण चिह्नों का उपयोग तब करें जब &
साथ कई कथन शामिल हों या |
- वैकल्पिक रूप से, वैरिएबल के मान के अंत के बाद सीधे प्रतीक को रखें:
SET var=val & goto :next <-- '%var%' == 'val '
SET "var=val" & goto :next <-- '%var%' == 'val'
SET var=val& goto :next <-- '%var%' == 'val'
प्रयोग
echo %var%
यह कोड var
के मान को प्रतिध्वनित करेगा
यदि setLocal EnableDelayedExpansion
का उपयोग किया जाता है, तो निम्नलिखित var
के मान को प्रतिध्वनित करेगा (मानक अभिव्यक्ति% var% उस संदर्भ में काम नहीं करेगा)।
echo !var!
बैच फ़ाइलों में, चर का उपयोग किसी भी संदर्भ में किया जा सकता है, जिसमें कमांड या अन्य चर के कुछ हिस्सों के रूप में शामिल हैं। आप इसे परिभाषित करने से पहले एक चर नहीं कह सकते हैं।
कमांड के रूप में चर का उपयोग करना:
set var=echo
%var% This will be echoed
अन्य चर में चर का उपयोग करना:
set var=part1
set %var%part2=Hello
echo %part1part2%
परिवर्तनशील प्रतिस्थापन
अन्य प्रोग्रामिंग भाषाओं के विपरीत, बैच स्क्रिप्ट में बैच स्क्रिप्ट चलने से पहले एक चर को इसके वास्तविक मूल्य द्वारा प्रतिस्थापित किया जाता है। दूसरे शब्दों में, प्रतिस्थापन तब किया जाता है जब स्क्रिप्ट को कमांड प्रोसेसर द्वारा मेमोरी में पढ़ा जाता है, न कि जब स्क्रिप्ट को बाद में चलाया जाता है ।
यह स्क्रिप्ट के भीतर आदेशों के रूप में चर के उपयोग को सक्षम करता है, और स्क्रिप्ट में अन्य चर नामों के भाग के रूप में, आदि इस संदर्भ में "स्क्रिप्ट" एक पंक्ति - या ब्लॉक - कोड की, गोल कोष्ठक से घिरा हुआ है: ()
।
लेकिन इस व्यवहार का मतलब यह है कि आप किसी ब्लॉक के अंदर एक वैरिएबल के मूल्य को नहीं बदल सकते हैं!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
छप जाएगा
Hello
Hello
चूंकि (जैसा कि आप देखते हैं, जब स्क्रिप्ट को कमांड विंडो में चलाते हैं) तो इसका मूल्यांकन किया जाता है:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
उपरोक्त उदाहरण में, ECHO
कमांड का मूल्यांकन Hello
रूप में किया जाता है जब स्क्रिप्ट को मेमोरी में पढ़ा जाता है, इसलिए स्क्रिप्ट Hello
हमेशा के लिए गूंज देगी, हालांकि स्क्रिप्ट के माध्यम से कई पास किए जाते हैं।
अधिक "पारंपरिक" चर व्यवहार को प्राप्त करने का तरीका (स्क्रिप्ट चल रहा है, जबकि चर का विस्तार किया जा रहा है) "विलंबित विस्तार" को सक्षम करना है। इसमें लूप इंस्ट्रक्शन (आमतौर पर एक लूप में, बैच स्क्रिप्ट में) से पहले स्क्रिप्ट में उस कमांड को जोड़ना और वेरिएबल के नाम में प्रतिशत चिह्न (%) के बजाय विस्मयादिबोधक चिह्न (!) का उपयोग करना शामिल है:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
छप जाएगा
Hello
Goodbye
वाक्यविन्यास %%a in (1,1,2)
लूप को 2 बार चलाने का कारण बनता है: पहले अवसर पर, वैरिएबल 'हैलो' का प्रारंभिक मूल्य रखता है, लेकिन लूप के माध्यम से दूसरे पास पर - दूसरा निष्पादित किया गया 1 पास पर अंतिम क्रिया के रूप में SET निर्देश - यह संशोधित मूल्य 'अलविदा' में बदल गया है।
उन्नत चर प्रतिस्थापन
अब, एक उन्नत तकनीक। CALL
कमांड के उपयोग से बैच कमांड प्रोसेसर स्क्रिप्ट की एक ही लाइन पर स्थित वैरिएबल का विस्तार कर सकता है। यह दोहराए गए कॉल और संशोधक के उपयोग से बहुस्तरीय विस्तार प्रदान कर सकता है।
यह उपयोगी है, उदाहरण के लिए, एक लूप। निम्नलिखित उदाहरण के अनुसार, जहां हमारे पास चर की एक सूची है:
"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"
हम निम्नलिखित लूप का उपयोग करके इसे प्राप्त कर सकते हैं:
setlocal enabledelayedexpansion
for %%x in (%*) do (
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
आउटपुट:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
ध्यान दें कि चर !i!
पहले इसके प्रारंभिक मूल्य में विस्तार किया जाता है, 1, फिर परिणामी चर,% 1, को इसके वास्तविक मूल्य c:\MyFiles\test1.txt
। यह चर i
का दोहरा विस्तार है। अगली पंक्ति में, i
फिर से डबल विस्तारित हो गया i
, CALL ECHO
कमांड के उपयोग के साथ %%
चर उपसर्ग के साथ, फिर स्क्रीन पर मुद्रित (यानी स्क्रीन पर प्रदर्शित)।
प्रत्येक क्रमिक लूप से गुजरने पर, प्रारंभिक संख्या 1 से बढ़ जाती है (कोड i+=1
)। इस प्रकार यह करने के लिए बढ़ जाती है 2
लूप के माध्यम से 2 पास पर, और करने के लिए 3
3 पास पर। इस प्रकार स्ट्रिंग प्रत्येक पास के साथ स्क्रीन में बदल जाती है।
कई चर घोषित करें
जब बैच की शुरुआत में कई चर परिभाषित किए जाते हैं, तो प्रतिस्थापन स्ट्रिंग को नियोजित करके एक छोटी परिभाषा प्रपत्र का उपयोग किया जा सकता है।
@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"
for /f %%l in ('set _') do echo %%l
exit /b
_A=good
_D=6
_E=bad
_G=ugly
उपरोक्त उदाहरण में ध्यान दें, चर स्क्रीन पर मुद्रित होने पर मूल रूप से वर्णानुक्रम में क्रमबद्ध होते हैं।
एक चर के रूप में एक चर का उपयोग करना
SET
कथन में रिक्त स्थान का उपयोग करके चर का एक सेट बनाना संभव है जो किसी सरणी के समान कार्य कर सकता है (हालाँकि वे वास्तविक सरणी वस्तु नहीं हैं):
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
echo Get the variable directly: %var%
परिणाम:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
इंडेक्स का उपयोग करके अपने चर को घोषित करना भी संभव है ताकि आप विशिष्ट जानकारी प्राप्त कर सकें। यह एक सरणी के भ्रम के साथ, कई चर बनाएगा:
@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%
परिणाम:
A
foo bar
123
Get one of the variables directly: foo bar
ध्यान दें कि ऊपर दिए गए उदाहरण में, आप यह var
नहीं कर सकते हैं कि वांछित इंडेक्स क्या है, यह बताए बिना क्योंकि var
अपने आप में मौजूद नहीं है। यह उदाहरण विस्मयादिबोधक बिंदुओं के साथ संयोजन के रूप में setlocal enabledelayedexpansion
का भी उपयोग करता है !var[%%a]!
। आप इसके बारे में अधिक जानकारी वैरिएबल सबस्टीट्यूशन स्कोप डॉक्यूमेंटेशन में देख सकते हैं ।
चर पर संचालन
set var=10
set /a var=%var%+10
echo %var%
var
का अंतिम मान 20 है।
एक IF ब्लॉक या FOR लूप पर उदाहरण के लिए उपयोग किए जाने वाले कमांड ब्लॉक के भीतर दूसरी पंक्ति काम नहीं कर रही है क्योंकि मानक पर्यावरण चर विस्तार के बजाय विलंबित विस्तार की आवश्यकता होगी।
यहाँ एक और बेहतर तरीका है, जो कमांड ब्लॉक में भी काम कर रहा है:
set var=10
set /A var+=10
echo %var%
कमांड प्रॉम्प्ट वातावरण हस्ताक्षरित 32-बिट पूर्णांक मानों के साथ समर्थन करता है:
- जोड़
+
और+=
- घटाव
-
और-=
- गुणा
*
और*=
- विभाजन
/
और/=
- मापांक विभाजन
%
और%=
- बिटवाइज़ और
&
- बिटवाइज OR
|
- बिटवाइज़ नहीं
~
- बिटवाइज XOR
^
- बिटवाइड बाईं पारी
<<
- बिटवाइज़ राइट शिफ्ट
>>
- तार्किक नहीं
!
- एकात्मक ऋण
-
-
(
और)
साथ समूहीकरण
विंडोज कमांड दुभाषिया अंकगणितीय अभिव्यक्तियों में 64-बिट पूर्णांक मान या फ्लोटिंग पॉइंट मान का समर्थन नहीं करता है।
नोट: ऑपरेटर %
को बैच फ़ाइल में %%
रूप में ऑपरेटर के रूप में व्याख्या करने के लिए लिखा जाना चाहिए।
एक कमांड प्रॉम्प्ट विंडो में कमांड लाइन set /A Value=8 % 3
को निष्पादित करने के लिए पर्यावरण चर Value
को 2
Value
और इसके अतिरिक्त आउटपुट 2
।
एक बैच फ़ाइल में लिखा होना चाहिए set /A Value=8 %% 3
पर्यावरण 2
के मान को असाइन करने के लिए वैरिएबल Value
और कुछ भी नहीं है आउटपुट क्रमशः STDOUT (मानक आउटपुट) को संभालने के लिए लिखा गया है। एक बैच set /A Value=8 % 3
बैच फ़ाइल में बैच फ़ाइल के निष्पादन पर त्रुटि संदेश गुम ऑपरेटर ।
पर्यावरण को केवल अंकगणित संचालन के लिए स्विच /A
आवश्यकता होती है, न कि साधारण स्ट्रिंग चर के लिए।
set /A
बाद अंकगणितीय अभिव्यक्ति में प्रत्येक स्ट्रिंग चाहे संख्या और न ही एक ऑपरेटर को स्वचालित रूप से एक पर्यावरण चर के नाम के रूप में व्याख्या की जाती है।
उस कारण के लिए %variable%
साथ या चर के साथ एक चर का मान संदर्भित !variable!
यह आवश्यक नहीं है कि जब चर नाम में केवल वर्ण अक्षर (0-9A-Za-z_) हों, जिसमें पहले वर्ण का अंक न हो, जो विशेष रूप से कमांड ब्लॉक के भीतर शुरू होने वाले (
और मिलान के साथ समाप्त होने वाले )
।
संख्याओं को स्ट्रिंग से पूर्णांक में परिवर्तित किया जाता है C / C ++ फ़ंक्शन के साथ स्ट्रेटोल को base
शून्य किया जाता है जिसका अर्थ है स्वचालित आधार निर्धारण जो आसानी से अप्रत्याशित परिणाम दे सकता है।
उदाहरण:
set Divided=11
set Divisor=3
set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor
echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%
set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3
echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%
set /A Result%%=7
echo -90 %%= 7 = %Result%
set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue
echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%
इस उदाहरण का आउटपुट है:
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
अंकगणितीय अभिव्यक्ति के मूल्यांकन पर परिभाषित नहीं किए गए चर को मान 0 के साथ प्रतिस्थापित किया जाता है।
एक इनपुट से चर सेट करना
SET
कमांड के साथ /p
स्विच का उपयोग करके आप एक इनपुट से चर को परिभाषित कर सकते हैं।
यह इनपुट उपयोगकर्ता इनपुट (कीबोर्ड) हो सकता है:
echo Enter your name :
set /p name=
echo Your name is %name%
जिसे इस तरह सरल बनाया जा सकता है:
set /p name=Enter your name :
echo Your name is %name%
या आप किसी फ़ाइल से इनपुट प्राप्त कर सकते हैं:
set /p name=< file.txt
इस स्थिति में आपको file.txt
से पहली पंक्ति का मान मिलेगा
किसी फ़ाइल में विभिन्न पंक्ति का मान प्राप्त करना:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt