बस Vlastimil के जवाब पर थोड़ा विस्तार करने के लिए ...
जब FORआदेश निष्पादित करता है "echo g"और पाइप उत्पादन करने के लिए findstr, के लिए पहले एक नया आदेश प्रोसेसर जिसकी वजह से शुरू करने के लिए है \blah\startfile.batनिष्पादित किया जाना है।
\ blah \ startfile.bat एक लाइन युक्त आउटपुट देता है sss ttt। यही कारण है कि लाइन द्वारा संसाधित किया जाता है के लिए किया जाता है और नहीं करने के लिए पारित कर दिया findstr ।
के लिए मदद अनुसार के लिए :
प्रसंस्करण में ... शामिल हैं, इसे पाठ की अलग-अलग पंक्तियों में तोड़कर प्रत्येक पंक्ति को शून्य या अधिक टोकन में पार्स कर रहा है। लूप के लिए बॉडी को तब वेरिएबल वैल्यू (एस) के साथ बुलाया जाता है, जो पाए गए स्ट्रिंग (एस) में सेट होता है। डिफ़ॉल्ट रूप से, / F प्रत्येक पंक्ति से पहले खाली टोकन को अलग करता है ...
के लिए डिफ़ॉल्ट सीमांकक के लिए कर रहे हैं: "," (अंतरिक्ष अल्पविराम और अर्ध-उपनिवेश)।
प्रक्रियाओं के लिए पहली पंक्ति में स्ट्रिंग शामिल है: sss ttt । उस स्ट्रिंग में एक " "(स्पेस) होता है, जो फॉर के लिए डिफॉल्ट सीमांकक है , जो लाइन को पार्स करता है और पहले टोकन स्ट्रिंग: "sss" को "% f" असाइन करता है । तो "इको% f" केवल के साथ एक लाइन आउटपुट करता है: "sss" । यह पहली पंक्ति है जिसे आप प्रिंट करते हुए देखते हैं। "TTT" बस क्योंकि त्याग दिया जाता है "के लिए ... गूंज% च" आदेश पहले टोकन से ज्यादा कुछ भी शामिल करने के लिए निर्दिष्ट नहीं किया।
यदि FOR कमांड को अलग तरह से लिखा जाता है, तो आपने पूर्ण पंक्ति "sss ttt" को प्रतिध्वनित होते देखा होगा ।
यहाँ 3 तरीके हैं के लिए आदेश है कि ऐसा करने के लिए लिखा जा सकता था।
पहला तरीका, का उपयोग कर "delims="विकल्प, सीमांकक के लिए सेट के लिए करने के लिए "खाली" है, तो के लिए रिटर्न 1 निशानी के रूप में पूरे लाइन। टोकन अभी भी पार्स किए गए हैं, और सभी सीमांकक ( ";" ) हटा दिए जाते हैं, फिर सभी टोकन को फिर से प्रत्येक टोकन के बीच के स्थान के साथ जोड़ दिया जाता है। यह संयुक्त मान "% f" चर में लौटाया जाता है
C:\>for /f "delims=" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\>echo mm nn oo ss tt
mm nn oo ss tt
यह अगला तरीका, "tokens=*"विकल्प का उपयोग करते हुए , बताए गए सभी टोकन को निर्दिष्ट चर ( "% f" ) के मूल्य में डालने के लिए कहता है । टोकन अभी भी पार्स किए गए हैं, और सभी सीमांकक हटा दिए जाते हैं, फिर सभी टोकन को फिर से प्रत्येक टोकन के बीच के स्थान के साथ जोड़ दिया जाता है।
C:\>for /f "tokens=*" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt
यह तीसरा तरीका, "tokens=1,*"विकल्प का उपयोग करते हुए , निर्दिष्ट चर ( "%" " ) के मूल्य में पाया गया पहला (1) टोकन लगाने के लिए कहता है । और, बचे हुए टोकन को पार्स किया जाता है, और सभी सीमांकक हटा दिए जाते हैं, फिर उन सभी बचे हुए टोकनों को फिर से प्रत्येक टोकन के बीच के स्थान के साथ जोड़ दिया जाता है, और यह संयुक्त मान उस अक्षर के साथ नामित चर में वापस आ जाता है जो निर्दिष्ट चर नाम का अनुसरण करता है (इसलिए इस मामले में, चर "% g" )।
C:\>for /f "tokens=1,*" %f in ('echo sss ttt') do echo %f %g
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"
C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"
ध्यान दें कि निम्नलिखित काम नहीं करेगा क्योंकि "% f" के निर्दिष्ट चर से परे चर के लिए परिभाषित "टोकन =" नहीं हैं :
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
इसलिए, आपके उदाहरण में, यदि आपने "delims="विकल्प जोड़ा है , तो आप यह देखेंगे:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>