Windows बैच फ़ाइल में कमांड के परिणाम के साथ एक चर का मान सेट करें


98

बैश वातावरण में काम करते समय , कमांड के परिणाम के रूप में एक चर का मान सेट करने के लिए, मैं आमतौर पर करता हूं:

var=$(command -args)

जहाँ varकमांड द्वारा परिवर्तनशील चर है command -args। मैं तब उस चर को एक्सेस कर सकता हूं $var

ऐसा करने के लिए एक अधिक पारंपरिक तरीका जो लगभग हर यूनिक्स शेल के साथ संगत है:

set var=`command -args`

उस ने कहा, मैं Windows बैच फ़ाइल में कमांड के परिणाम के साथ एक चर का मूल्य कैसे निर्धारित कर सकता हूं ? मैंने कोशिश की:

set var=command -args

लेकिन मुझे लगता है कि varयह command -argsकमांड के आउटपुट के बजाय सेट है ।

जवाबों:


62

जेसी का वर्णन करने के लिए , Windows बैच फ़ाइल से आपको लिखना होगा:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

लेकिन, यदि आप यूनिक्स-टाइप स्क्रिप्टिंग के लिए उपयोग किए जाते हैं , तो मैं आपके विंडोज सिस्टम पर सिगविन का उपयोग करने का सुझाव देता हूं ।


19
for /f "delims=" %a in ('ver') do @set foobar=%aकमांड प्रॉम्प्ट पर उपयोग करें । for /f "delims=" %%a in ('ver') do @set foobar=%%aस्क्रिप्ट फ़ाइलों में उपयोग
georg

एक हल्का विकल्प Gnu On Windows ( github.com/bmatzelle/gow/wiki ) है। बस एक कमांड प्रॉम्प्ट खोलें और चलाएं bash। फिर आप बैश कमांड लिख सकते हैं। आप बैश स्क्रिप्ट भी निष्पादित कर सकते हैं।
नाथन

4
ध्यान दें कि यदि आपकी कमांड में एक पाइप शामिल है, तो आपको इसे एक कैरेट के साथ भागने की जरूरत है, उदाहरण के लिए: / f "delims =" %% a ('echo foobar ^ | sed -es / foo / fu /') @ सेट फ़ॉबोर = %% a
योयो

35

Windows बैच कमांड के बाद से कुछ सावधान रहने की जरूरत है:

for /f "delims=" %%a in ('command') do @set theValue=%%a

यूनिक्स शैल विवरण के समान शब्दार्थ नहीं है:

theValue=`command`

उस मामले पर विचार करें जहां कमांड विफल हो जाती है, जिससे त्रुटि होती है।

यूनिक्स शेल संस्करण में, "theValue" का असाइनमेंट अभी भी होता है, किसी भी पिछले मूल्य को एक खाली मान से प्रतिस्थापित किया जा रहा है।

विंडोज बैच संस्करण में, यह "फॉर" कमांड है जो त्रुटि को संभालता है, और "डू" क्लॉज कभी नहीं पहुंचता है - इसलिए "theValue" के किसी भी पिछले मूल्य को बरकरार रखा जाएगा।

Windows बैच स्क्रिप्ट में अधिक यूनिक्स जैसे शब्दार्थ प्राप्त करने के लिए, आपको यह सुनिश्चित करना होगा कि असाइनमेंट होता है:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Windows बैच में यूनिक्स स्क्रिप्ट को परिवर्तित करते समय चर के मूल्य को साफ करने में असफल होना सूक्ष्म त्रुटियों का कारण हो सकता है।


2
विंडोज और * निक्स के बीच के सूक्ष्म अंतर को समझाने के लिए धन्यवाद।
जीरोन विर्ट प्लिमर्स

3
में किसी विशेष वर्ण से बचने के लिए भी याद रखें command; उदाहरण के लिए: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a
Bill_Stewart

@Bill_Stewart आपने अभी-अभी मेरा दिन बचाया है, एक पल के लिए मुझे लगा कि पाइप्ड कमांड्स के आउटपुट को एक चर में सौंपना बहुत कठिन है
MrBrody

19

जब मुझे अपने बैच फ़ाइल में डेटाबेस क्वेरी के परिणामों की आवश्यकता होती है, तो मैं इसे कैसे करता हूं:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

कुंजी 2 पंक्ति में है: "सेट / पी" "परिणाम" के मूल्य को "<__" पुनर्निर्देशन ऑपरेटर के माध्यम से "__query.tmp" में पहली पंक्ति के मूल्य (केवल) पर सेट करता है।


14

एकमात्र तरीका जो मैंने देखा है वह यह है कि यदि आप ऐसा करते हैं:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver विंडोज के लिए संस्करण कमांड है और मेरे सिस्टम पर यह उत्पादन करता है:

Microsoft Windows [Version 6.0.6001]

स्रोत


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.