एक बैच फ़ाइल में एक चर के रूप में कमांड आउटपुट कैसे सेट करें


242

क्या उदाहरण के लिए एक बैच फ़ाइल के स्टेटमेंट आउटपुट को सेट करना संभव है:

findstr testing > %VARIABLE%

echo %VARIABLE%




केवल मनोरंजन के लिए एक और डुप्लिकेट: विंडोज बैच एक प्रोग्राम के आउटपुट को एक चर पर
icc97

जवाबों:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

मैं हमेशा USEBACKQ का उपयोग करता हूं ताकि यदि आपके पास डालने के लिए एक स्ट्रिंग या एक लंबा फ़ाइल नाम है, तो आप कमांड को खराब किए बिना अपने दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं।

अब यदि आपके आउटपुट में कई लाइनें होंगी, तो आप ऐसा कर सकते हैं

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
Win7 सिस्टम में मेरे लिए काम किया, धन्यवाद! (और हाँ, यह 7 साल की उपयोगिता है) PS आदेशों में% से %% का विस्तार करना न भूलें!
दिमित्री इलुकिन

यह अच्छा काम करता है ... जब तक उत्पादन विस्मयादिबोधक अंक में शामिल है, का उपयोग करते समय के रूप में इन नियंत्रण पात्रों के रूप में व्याख्या की जाएगी (!)ENABLEDELAYEDEXPANSION
JonathanDavidArndt

यह अच्छी तरह से काम करता है, सिवाय इसके कि आपको |किस मामले में उपयोग करने की आवश्यकता है, यह काम नहीं करता है।
मैट वुकोमोनोविक

6
@MattVukomanovic यह मेरे लिए काम कर ^|रहा है |, जैसा कि यहाँ
AST

क्या यह commandकिसी भी तरह से बाहर निकलें कोड पर कब्जा करने के लिए संभव है , कृपया? मुझे यकीन है कि यह एक गैर-शून्य कोड लौटा %ERRORLEVEL%रहा है, लेकिन हमेशा 0 होता है, कोई फर्क नहीं पड़ता कि मैं इसका उपयोग करने की कोशिश करता हूं (यहां तक ​​कि doब्लॉक के अंदर भी )। इसलिए मुझे लगता है कि उस forनिर्माण का कुछ हिस्सा इसे अधिलेखित कर रहा है। BTW यह अविश्वसनीय है कि कैसे पागल लग कोड कुछ तो प्राथमिक के लिए आवश्यक है।
डेविड फेरेंस्की रोगोजान 21

69

मुझे यह धागा वहां पर इंटरवेब की चीज में मिला। उबल जाता है:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

आप किसी अस्थायी फ़ाइल में कमांड के आउटपुट को रीडायरेक्ट भी कर सकते हैं, और फिर उस अस्थायी फ़ाइल की सामग्री को अपने चर में पसंद कर सकते हैं। हालांकि यह बहु-इनपुट इनपुट के साथ काम नहीं करता है।

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

टॉम के हार्डवेयर पर धागे का श्रेय।


3
केवल निचले दृष्टिकोण तक कमियां (जो अन्य सभी तरीकों से बेहतर है) यह है कि यह मल्टी-लाइन आउटपुट के साथ काम नहीं करता है।
डेंगू

VER के लिए मैं एक और तरीका: for / f "tokens = 2 delims = [,]" %% a ('ver') संस्करण %% को प्रतिध्वनि% संस्करण%
Hardoman

1
आप पसंद के लिए दूसरा परिणाम पसंद कर रहे हैं - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

आपके दूसरे उदाहरण ने मुझे Chromedriver.exe बनाम एक पाठ फ़ाइल के संस्करण संख्या की जांच करने के लिए बैच फ़ाइल लिखने में बहुत मदद की। मैं एक पुराना DOS डायनासोर हूं, और सेट कमांड के स्विच के बारे में नहीं जानता था। अन्य सामान मेरे लिए ओवरकिल था।
बिल हिलमैन 16

47

एक पंक्ति में:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

कमांड आउटपुट को% g में तब VAR में सेट किया जाएगा।

अधिक जानकारी: https://ss64.com/nt/for_cmd.html


19
मेरा बैच "% g" के साथ नहीं चला। यह "%% g" के साथ चला।
सैंटियागो विलाफुर्ते

5
+ सैंटियागो विलाफुर्ते: हाँ, यदि आप बैच फ़ाइल से चल रहे हैं, लेकिन यदि आप इसे कमांड लाइन से स्वयं चलाना चाहते हैं (उदाहरण के लिए: बैच फ़ाइल में डालने से पहले इसका परीक्षण करने के लिए) तो आप एक% का उपयोग करते हैं।
ब्रेंट रिटनहाउस 12

19

फ़ाइल पढ़ने के लिए ...

set /P Variable=<File.txt

एक फ़ाइल लिखने के लिए

@echo %DataToWrite%>File.txt

ध्यान दें; <> वर्ण से पहले रिक्त स्थान होने से चर के अंत में भी एक स्थान जुड़ जाता है

फ़ाइल को जोड़ने के लिए, एक लकड़हारा प्रोग्राम की तरह, पहले इसमें एक फ़ाइल दर्ज करें जिसमें e.txt नामक एक कुंजी दर्ज करें

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

आपका लॉग इस तरह दिखेगा

Entry1
Entry2 

और इसी तरह

वैसे भी कुछ उपयोगी बातें


आपके उत्तर के लिए धन्यवाद। BTW "सेट / पी वेरिएबल = <File.txt" फ़ाइल की केवल पहली पंक्ति को पढ़ता है
Deepscorn

19

ये उत्तर उस उत्तर के बिल्कुल पास थे जिसकी मुझे आवश्यकता थी। यह उन पर विस्तार करने का एक प्रयास है।

एक बैच फ़ाइल में

यदि आप किसी .batफ़ाइल के भीतर से चल रहे हैं और आप एक एकल लाइन चाहते हैं जो आपको एक जटिल आदेश को निर्यात करने की अनुमति देता है जैसे jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonकि नामांकित चर AWS_ACCESS_KEYतो आप यह चाहते हैं:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

कमांड लाइन पर

यदि आप उस C:\प्रॉम्प्ट पर हैं जो आप एक एकल लाइन चाहते हैं जो आपको एक जटिल कमांड चलाने की अनुमति देता है जैसे jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonकि नामांकित चर AWS_ACCESS_KEYतो आप यह चाहते हैं:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

व्याख्या

ऊपर दिए गए दो उत्तरों के बीच एकमात्र अंतर यह है कि कमांड लाइन पर, आप अपने चर में एक% का उपयोग करते हैं। बैच फ़ाइल में, आपको प्रतिशत चिह्नों (%%) पर दोगुना करना होगा।

चूंकि कमांड में कॉलन, कोट्स और कोष्ठक शामिल हैं, USEBACKQइसलिए आपको विकल्पों में लाइन को शामिल करने की आवश्यकता है ताकि आप कमांड को चलाने के लिए बैककॉट्स का उपयोग कर सकें और फिर उसके अंदर सभी प्रकार के मज़ेदार अक्षर।


13

यदि आप एक अस्थायी फ़ाइल में आउटपुट नहीं करना चाहते हैं और फिर एक चर में पढ़ते हैं, तो यह कोड एक चर में प्रत्यक्ष कमांड का परिणाम संग्रहीत करता है:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

यदि आप दोहरे उद्धरण चिह्नों में खोज स्ट्रिंग संलग्न करना चाहते हैं:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

यदि आप इस कोड को बैच फ़ाइल में संग्रहीत करना चाहते हैं, तो एक अतिरिक्त% प्रतीक जोड़ें:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

एक चर में एक निर्देशिका और स्टोर में फ़ाइलों की संख्या की गणना करने के लिए एक उपयोगी उदाहरण: (पाइपिंग दिखाता है)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

नोट डबल कोट्स "या गंभीर लहजे` आदेश कोष्ठक में के बजाय एकल उद्धरण का उपयोग करते हैं। इस के लिए क्लीनर विकल्प है delims, tokensया usebackqमें forपाश।

विन 10 CMD पर परीक्षण किया गया।


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

मैं नहीं देख सकता कि यह कैसे प्रश्न हल करता है। appcmdएक मानक कार्यक्रम नहीं है और मैं यह नहीं देख सकता कि आप प्रोग्राम आउटपुट को एक चर में कैसे असाइन करते हैं। अंत में आपको कुछ और स्पष्टीकरण की आवश्यकता है
जेब

-3

मैंने इसे इस तरह से परखा है और इसने काम किया है:

SET /P Var= | Cmd

कमांड को एक चर में पाइप करके, प्रॉम्प्ट कमांड के परिणाम को " Cmd" वेरिएबल में " Var" डालेगा ।

अपडेट करें:

यह काम नहीं करता है, मेरी बुरी, मैंने जो स्क्रिप्ट किया वह यह था:

SET /P Var= | dir /b *.txt
echo %Var%

यह वास्तव में दिखा रहा है मान लीजिए " test.txt" है, लेकिन यह वास्तव में " dir /b *.txt" कमांड का परिणाम दिखा रहा था , नहीं echo %var%। मैं भ्रमित हो गया क्योंकि दोनों आउटपुट समान थे।


3
यदि आपने इरादा किया था, pipe the command into a variable promptतो आपको dir /b *.txt | SET /P Var=अपनी पाइप दिशा को सही करने के लिए इसे लिखना चाहिए था । पुनश्च: यह उस तरह से भी काम नहीं करता है!
जेसी चिशोल्म

-18

उममीद है कि इससे मदद मिलेगी

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
नहीं, यह सवाल का जवाब नहीं देता है। यह सवाल एक कमांड के आउटपुट को एक चर में लाने के बारे में है
jeb

आसान तरीका यह है कि आप किसी फ़ाइल को लिखें और उसे उस फ़ाइल से पढ़ें। findstr "परीक्षण" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.