बैश बैकटिक्स के बराबर बैच


97

बैश के साथ काम करते समय, मैं एक कमांड के आउटपुट को दूसरे कमांड में डाल सकता हूं जैसे:

my_command `echo Test`

जैसा होगा वैसा ही होगा

my_command Test

(जाहिर है, यह सिर्फ एक गैर-व्यावहारिक उदाहरण है।)

मैं सोच रहा हूं कि क्या आप बैच में भी ऐसा ही कर सकते हैं।


जवाबों:


53

आप आउटपुट को पहले किसी फ़ाइल में रीडायरेक्ट करके कर सकते हैं। उदाहरण के लिए:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
यह आपको एक जगह खोजने की आवश्यकता है जहां आपके पास अस्थायी फ़ाइल संग्रहीत करने के लिए लेखन पहुंच है; आपको अपने आप को साफ करना होगा; यह बहुत ही उदाहरण आपको इनपुट की पहली पंक्ति को पढ़ने में सक्षम बनाता है। सभी व्यावहारिक उद्देश्यों के लिए, for /fसंस्करण बहुत बेहतर है।
जॉय

@grawity - साथ%random%
bacar

1
@joey यह एक में एक कमांड लाइन तर्क को प्रत्येक पंक्ति पढ़ करता है, लेकिन CONCATENATE करने के लिए कैसे एक आदेश।
user877329

यह न्यूलाइन (एस) को कैसे संभालता है?
andrewrk

103

आप for /fकमांड के साथ cmd.exe स्क्रिप्ट का उपयोग करके समान कार्यक्षमता प्राप्त कर सकते हैं :

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

हाँ, यह थोड़े गैर-स्पष्ट (कम से कम कहने के लिए) है, लेकिन यह वहाँ है।

for /?गोर विवरण के लिए देखें ।

सिडेनोट: मैंने सोचा था कि echo" for /f" कमांड में बैकटिक्स के अंदर " " का उपयोग करने के लिए " " का उपयोग करने की आवश्यकता होगी cmd.exe /c echo Testक्योंकि " echoएक आंतरिक कमांड है cmd.exe, लेकिन यह अधिक प्राकृतिक तरीके से काम करता है। विंडोज बैच स्क्रिप्ट हमेशा मुझे किसी तरह आश्चर्यचकित करती है (लेकिन आमतौर पर अच्छे तरीके से नहीं)।


2
आपको आमतौर पर ऐसा करना पड़ता है जब बाहरी कार्यक्रमों से शेल-बिल्डिंस को निष्पादित किया जाता है जो स्वचालित रूप से एक शेल नहीं बनाते हैं। Ie C की स्थिति system()ठीक थी, क्योंकि यह किसी भी मामले में एक शेल शुरू करता है, लेकिन .NET Process.Startको शेल को स्पष्ट रूप से लागू करने की आवश्यकता है। कुछ ऐसा ही, iirc। किसी भी मामले में, मैं इसे स्वीकार किए गए एक से बेहतर जवाब मानता हूं :-)
जॉय

2
forचोट न करने के विकल्प लेकिन समस्या को भ्रमित करते हैं। इसके बारे में क्या:for /f %%a in ('"echo Test"') do my_command %%a
इवान हास

9
कमांड लाइन पर समान निष्पादित करते समय, बैच स्क्रिप्ट के बजाय %% के बजाय एकल% का उपयोग करें।
jsears

2
पाइपिंग के साथ अच्छी तरह से काम नहीं करता है, उदाहरण के लिए ">" ऑपरेटर। लेकिन अन्यथा यह कमाल है। जब तक यह सिर्फ एक% बनाम %% मुद्दा था मेरे पास नहीं था।
जोनाथन

3
@ इवान: tokens=*महत्वपूर्ण है। अन्यथा, यदि कमांड के परिणाम में रिक्त स्थान शामिल हैं, तो केवल पहला शब्द आउटपुट है। इसे प्रॉम्प्ट पर चलाएँ for /f %a in ('"echo foo bar"') do echo "%a":। यह छपेगा "foo"
डैन डस्केल्सस्कु

29

"के लिए" आदेश के लिए प्रलेखन पढ़ें: for /?

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

for /F %i in ('echo Test') do my_command %i

6
यदि कोई व्यक्ति बैच फ़ाइल (* .bat) से कमांड निष्पादित करता है, तो इस पर कोई और ठोकर खाता है, दोनों% i चर को डबल प्रतिशत संकेत: %% i होना चाहिए।
मगिन

3

आप हमेशा विंडोज के अंदर बैश चला सकते हैं । मैं इसके साथ हर समय करना MSYS (ज्यादा से ज्यादा कुशल Cygwin )।


दुर्भाग्य से MSYS को अभी मुश्किल से बनाए रखा गया है, अप-टू-डेट बैश पाने के लिए आपको इसे अलग से इंस्टॉल करने की आवश्यकता है
Ed Randall

1
बिजीबॉक्स और भी छोटा है (~ 432KB)। पूर्ण बैश नहीं, हालांकि, ऐश। यहां अनौपचारिक विंडोज पोर्ट प्राप्त करें: frippery.org/busybox
मार्टिन

3

हो सकता है कि मैं मानक for /fविधि के वाक्य-विन्यास को परिमार्जन कर रहा हूँ , लेकिन जब मैंने एक बहुत ही जटिल कमांड को शामिल किया है & & | की सीमा में backticks के भीतर for /f, यह समस्याओं का कारण बनता है। सामान्य से मामूली संशोधन एक मनमानी जटिलता कमान को संभालने के लिए संभव है:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

अपनी पूर्ण और जटिल कमांड को पहले एक चर में डालकर, फिर जटिल कमांड को सीधे लूप की सीमा में डालने के बजाय सीमा में चर का संदर्भ देते हुए, आप वाक्यविन्यास व्याख्या के मुद्दों से बच सकते हैं। वर्तमान में यदि मैं सटीक कमांड को कॉपी करता हूं जिसे मैंने VVऊपर उदाहरण में चर में सेट किया है, जहां इसका उपयोग किया जाता है, %VV%तो यह सिंटैक्स त्रुटियों का कारण बनता है।


1
यह मेरे लिए काम नहीं करता था, लेकिन मैंने पाया कि आप कमांड के भीतर सीधे पाइपिंग कर सकते हैं यदि आप इसे कैरेट (^) के साथ छोड़ देते हैं: / f "यूज़बैकq टोकन के लिए = *" %% a (`कमांड ^) कमांड `) कमांड %% a
हेप्टाइट

@ हेपटाइट कार्ड से बचना मेरे लिए काम नहीं करता था, लेकिन डबल कोट्स के साथ आसपास की कमांड लाइन थी।
एलेक्जेंड्रा ज़ुर्बकिन 9'16

@Heptite मेरे मामले में मुझे नहीं पता था कि मुझे उन कमांडों की श्रृंखला के बारे में बताया जा रहा है जिन्हें पहले से चलाने की ज़रूरत थी, उन्हें एक मामले में एक फ़ाइल से निकाला गया, और दूसरे में पारित कर दिया गया। बचने के साथ आपको यह जानने की जरूरत है कि कमांड के माध्यम से कितनी बार भागने की जरूरत है, यह कितने दुभाषियों के माध्यम से चलने वाला है, और मेरे उपयोग के मामलों में जो दुभाषियों की एक सुसंगत संख्या नहीं थी।
mtalexan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.