2012-06-25 14 views
11

से बचने से मैंने हमेशा बैच से नफरत की है और मैं अभी भी सबसे सरल चीजों के लिए सी या PHP/पर्ल पसंद करता हूं। लेकिन इस बार मैं इसके बिना नहीं जा सका, **** श्वास ****।बैच: देखभाल

मैं एक ईको कमांड को किसी अन्य कमांड पर रीडायरेक्ट करना चाहता था।

echo example | more 

लेकिन मैं यह भी पाइप की गूंज भाग में विशेष वर्णों का उपयोग करने में सक्षम होना चाहता था: उदाहरण के लिए:

echo & | more 

कौन सा निश्चित रूप से काम नहीं किया। तो मैंने कोशिश की:

echo ^& | more 

जो या तो काम नहीं करता था। फिर परीक्षण-और-त्रुटि से मैंने पाया:

echo ^^^& | more 

और यह काम किया। लेकिन दिलचस्पी प्रोग्रामर के रूप में मुझे आश्चर्य है क्यों। ^& क्यों काम नहीं किया और ^^^& क्यों किया?

+1

मुझे यह मिला, शायद यह आपके लिए सहायक है? http://stackoverflow.com/questions/3813370/how-to-avoid-cmd-exe-interpreting-shell-special-characters-like – JohnP

+1

+1, यहां तक ​​कि आप मामूली हालांकि सर्वशक्तिमान बैच की सुंदरता, LOL । मैं समझता हूं कि बैच बेहद विचित्र, असंगत, और कम दस्तावेज है।लेकिन फिर मुझे लगता है कि चुनौती यह है कि मुझे इसके साथ इतना मजा क्यों है :-) – dbenham

+0

@ डेबेनहम, क्या विंडोज़ से बैच सिंटैक्स दस्तावेज करने में कोई प्रयास है? – Pacerier

उत्तर

10

विंडोज़ पाइप को कैसे लागू करता है इसका कारण यह है कि पाइप के प्रत्येक पक्ष को अपने स्वयं के सीएमडी खोल में निष्पादित किया जाता है। आपका आदेश echo ^& | more वास्तव में सही पर

C:\Windows\system32\cmd.exe /S /D /c" echo & " 
बाईं तरफ

और

C:\Windows\system32\cmd.exe /S /D /c" more " 

निष्पादित करने के लिए प्रयास करता है। आप देख सकते हैं कि बायां हाथ क्यों विफल रहता है - एक अनचाहे & गूंजने का प्रयास कर रहा है। वास्तविक बायीं ओर निष्पादित होने से पहले भागने प्रारंभिक पार्सिंग चरण से बच निकला था।

यह देखना भी आसान है कि आपका समाधान क्यों काम करता है। echo ^^^& | more के बाईं ओर

C:\Windows\system32\cmd.exe /S /D /c" echo ^& " 

कई सूक्ष्म जटिलताओं रहे हैं हो जाता है जब विंडोज पाइप के साथ काम कर रहे। अधिक जानकारी के लिए Why does delayed expansion fail when inside a piped block of code? का संदर्भ लें। चयनित उत्तर में सबसे अच्छी जानकारी है, लेकिन मैं चयनित उत्तर के संदर्भ प्राप्त करने के लिए प्रश्न और सभी उत्तरों को पढ़ने की सलाह देता हूं।

+2

+1, मेरे लिए बहुत तेज है और कुछ भी नहीं बचा है मैं – jeb

+0

जोड़ सकता हूं धन्यवाद आपके सहायक उत्तर के लिए बहुत बहुत धन्यवाद! – Jori

3

पहले ^^ चरित्र ही (दूसरा ^) से बचने के है और तीसरे ^& भागने है।

जब आप ECHO ^& | MORE की तरह एक आदेश चला, ^& खोल द्वारा & के साथ बदल से पहले उत्पादन MORE को पहुंचाया जाता है।

इसलिए, जब आप ECHO ^^^& | MORE चलाने के लिए, खोल ^ साथ ^^ और MORE करने के लिए & और फिर पाइप उत्पादन के साथ ^& बदल देता है।

+3

आपका पहला पैराग्राफ एक [जीभ-ट्विस्टर] (https://en.wikipedia.org/wiki/Peter_Piper#Lyrics) के लिए अच्छा है ... – Pacerier