2008-10-30 13 views
77

मुझे विंडोज मशीन पर एक फ़ाइल में कोण ब्रैकेट (< और>) वाली एक स्ट्रिंग को गूंजने की आवश्यकता है। असल में मैं जो करना चाहता हूं वह निम्नलिखित है:
echo some string < with angle > brackets >>myfile.txtविंडोज कमांड प्रॉम्प्ट में कोण कोण ब्रैकेट से बचें

यह काम नहीं करता है क्योंकि आदेश दुभाषिया कोण ब्रैकेट के साथ भ्रमित हो जाता है। मैं इस तरह की पूरी स्ट्रिंग को उद्धृत कर सकता हूं:
echo "some string < with angle > brackets" >>myfile.txt

लेकिन फिर मेरे पास मेरी फ़ाइल में दोहरे उद्धरण हैं जो मैं नहीं चाहता हूं।

कोष्ठक पलायन आला यूनिक्स या तो काम नहीं करता:
echo some string \< with angle \> brackets >>myfile.txt

विचार?

+0

उद्धरण के साथ क्या गलत है? – Oskar

+3

उद्धरण भी प्रतिबिंबित किया जाएगा। – dalle

उत्तर

138

कुछ कारणों से विंडोज़ बचने वाला चरित्र^है।

echo some string ^< with angle ^> brackets >>myfile.txt 
+8

खैर, बैकस्लैश का उपयोग पथनामों के लिए किया जाता है और डबल-कोट फ़ाइल नाम को लपेटना है जिसमें रिक्त स्थान हैं, इसलिए कई चरित्र विकल्प नहीं छोड़े गए हैं। –

+0

यह अन्य पात्रों जैसे एम्पर्सेंड (&), धन्यवाद के लिए भी काम करता है। – tenfour

+2

महान काम करता है! 'कुछ स्ट्रिंग को गूंजें^<कोण कोण>> ब्रैकेट्स >> con' के साथ परिणाम: _some string <कोण के साथ> brackets_ –

0

यूनिक्स आला कोष्ठक पलायन या तो काम नहीं करता है:

कोण \> कोष्ठक >> MyFile.txt के साथ कुछ स्ट्रिंग \ < गूंज

बैकस्लैश होगा एक पूर्ण पथनाम की शुरुआत माना जाना चाहिए।

+2

वर्तमान ड्राइव अक्षर से संबंधित पूर्ण पथनाम ...;) – dalle

+0

बैकस्लैश को इको कमांड के लिए पाठ के अंदर एक पूर्ण पथ नाम की शुरुआत नहीं माना जाता है - यह केवल सादा पाठ है जहां आप इसे भेजते हुए पाइप हो जाते हैं। - उदाहरण के लिए 'echo \ 'उदाहरण के रूप में काम करता है। - लेकिन हां, "\" कमांड-लाइन एस्केप कैरेक्टर के लिए एक बीमार विकल्प होगा क्योंकि प्रत्येक कमांड/प्रोग्राम जिसके लिए पथ या फ़ाइल नाम की आवश्यकता होती है, आपको इसके बजाय '\\' टाइप करना होगा। – BrainSlugs83

+0

यह उत्तर, स्वीकार्य रूप से अस्पष्ट, प्रश्न –

-2

तुम भी दोहरे उद्धरण चिह्नों का उपयोग कर सकते विशेष वर्ण से बचने के लिए ...

echo some string "<" with angle ">" brackets >>myfile.txt 
+3

का समाधान प्रदान नहीं करता है जो काम नहीं करता है। 'कुछ स्ट्रिंग को गूंजें "<" कोण के साथ ">" ब्रैकेट्स >> con' में परिणाम: _some स्ट्रिंग "<" कोण के साथ ">" brackets_ लेकिन ओपी चाहता है _ कुछ स्ट्रिंग <कोण के साथ> brackets_ –

23

यह सच है, सरकारी एस्केप वर्ण ^ है, लेकिन सावधान रहना, क्योंकि कभी कभी तुम तीन^ पात्रों की जरूरत है।

इस बकवास से बाहर
C:\WINDOWS> echo ^<html^> 
<html> 

C:\WINDOWS> echo ^<html^> | sort 
The syntax of the command is incorrect. 

C:\WINDOWS> echo ^^^<html^^^> | sort 
<html> 

C:\WINDOWS> echo ^^^<html^^^> 
^<html^> 

एक चाल है अन्य एक आदेश का उपयोग करने के लिए echo से उत्पादन और दोहरे उद्धरण चिह्नों के साथ बोली करने के लिए: यह सिर्फ कभी कभी है

C:\WINDOWS> set/p _="<html>" <nul 
<html> 
C:\WINDOWS> set/p _="<html>" <nul | sort 
<html> 

ध्यान दें कि यह नहीं होगा त्वरित पाठ पर अग्रणी रिक्त स्थान संरक्षित करें।

+0

धन्यवाद। यह स्पष्ट नहीं है। – user1167442

+1

पाइप को एकाधिक भागने की आवश्यकता क्यों है, इसके स्पष्टीकरण के लिए [my answer] (http://stackoverflow.com/a/26041395/1012053) का दूसरा भाग देखें। – dbenham

+0

Azure DOS/Kudu कंसोल में कमांड से बचने के लिए तीन '^^^ 'भी आवश्यक हैं। – lionello

5

ऐसे तरीके हैं जो ^ से बचने के दृश्यों से बचें।

आप विलंबित विस्तार के साथ चर का उपयोग कर सकते हैं। नीचे एक छोटी बैच स्क्रिप्ट प्रदर्शन

@echo off 
setlocal enableDelayedExpansion 
set "line=<html>" 
echo !line! 

या आप एक FOR/F पाश का उपयोग कर सकते हैं।

for /f "delims=" %A in ("<html>") do @echo %~A 

या एक बैच स्क्रिप्ट से: कमांड लाइन से

@echo off 
for /f "delims=" %%A in ("<html>") do echo %%~A 

कारण इन तरीकों काम है क्योंकि दोनों में देरी विस्तार और चर के विस्तार के लिए <, >, & की तरह विशेष ऑपरेटरों के बाद हो, |, &&, || पार्स किए गए हैं। अधिक जानकारी के लिए How does the Windows Command Interpreter (CMD.EXE) parse scripts? देखें।


sin3.14 points out that pipes may require multiple escapes। उदाहरण के लिए:

echo ^^^<html^^^>|findstr . 

कारण पाइप कई पलायन की आवश्यकता होती है क्योंकि पाइप के प्रत्येक पक्ष एक नया अध्यक्ष एवं प्रबंध निदेशक प्रक्रिया में निष्पादित किया जाता है, तो लाइन कई बार पार्स हो जाता है। विंडो के पाइप कार्यान्वयन के कई अजीब परिणामों के स्पष्टीकरण के लिए Why does delayed expansion fail when inside a piped block of code? देखें।

पाइप का उपयोग करते समय एकाधिक भागने से बचने के लिए एक और तरीका है। आप स्पष्ट रूप से अपने स्वयं के अध्यक्ष एवं प्रबंध निदेशक प्रक्रिया का दृष्टांत सकते हैं, और उद्धरण के साथ एकल भागने की रक्षा:

cmd /c "echo ^<html^>"|findstr . 

आप देरी विस्तार तकनीक का उपयोग करने के लिए पलायन से बचना चाहते हैं, तो और भी अधिक आश्चर्य कर रहे हैं (आप अगर आश्चर्य नहीं हो सकता है आप CMD.EXE के डिजाइन पर एक विशेषज्ञ हैं, लेकिन कोई आधिकारिक माइक्रोसॉफ्ट प्रलेखन कि इस सामग्री बताते हैं)

याद रखें कि पाइप के प्रत्येक पक्ष का अपना CMD.EXE प्रक्रिया में मार डाला जाता है, लेकिन प्रक्रिया करता है विलंबित विस्तार स्थिति का उत्तराधिकारी - यह बंद होने के लिए डिफ़ॉल्ट है। तो आपको स्पष्ट रूप से अपनी स्वयं की सीएमडी.एक्सईई प्रक्रिया को तुरंत चालू करना होगा और विलंबित विस्तार को सक्षम करने के लिए/V: ON विकल्प का उपयोग करना होगा।

@echo off 
setlocal disableDelayedExpansion 
set "line=<html>" 
cmd /v:on /c echo !test!|findstr . 

ध्यान दें कि विस्तारित विस्तार माता-पिता बैच स्क्रिप्ट में बंद है।

लेकिन पैरेंट स्क्रिप्ट में देरी विस्तार सक्षम होने पर सभी नरक टूट जाते हैं। निम्नलिखित करता नहीं काम:

@echo off 
setlocal enableDelayedExpansion 
set "line=<html>" 
REM - the following command fails 
cmd /v:on /c echo !test!|findstr . 

समस्या यह है कि माता-पिता !test! स्क्रिप्ट में विस्तार किया है, इसलिए नए अध्यक्ष एवं प्रबंध निदेशक प्रक्रिया पार्स करने के लिए असुरक्षित < और > कोशिश कर रहा है।

आप ! से बच सकते हैं, लेकिन यह मुश्किल हो सकता है, क्योंकि यह इस बात पर निर्भर करता है कि ! उद्धृत किया गया है या नहीं।

तो उद्धृत नहीं है, तो डबल भागने की जरूरत है:

@echo off 
setlocal enableDelayedExpansion 
set "line=<html>" 
cmd /v:on /c echo ^^!test^^!|findstr . 

तो उद्धृत किया, फिर एक ही भागने प्रयोग किया जाता है:

@echo off 
setlocal enableDelayedExpansion 
set "line=<html>" 
cmd /v:on /c "echo ^!test^!"|findstr . 

लेकिन वहाँ एक आश्चर्य की बात चाल है कि सभी पलायन से बचा जाता है है - enclosing पाइप के बाईं ओर पेरेंट स्क्रिप्ट को !test! का विस्तार करने से रोकता है:

@echo off 
setlocal enableDelayedExpansion 
set "line=<html>" 
(cmd /v:on /c echo !test!)|findstr . 

लेकिन मुझे लगता है कि यह भी मुफ्त लंच नहीं है, क्योंकि बैच पार्सर अंत में एक अतिरिक्त (शायद अवांछित) स्थान पेश करता है जब ब्रांड्स का उपयोग किया जाता है।

Aint बैच पटकथा मज़ा ;-)

1

क्रम में इस तरह के '>' विंडोज पर गूंज के साथ विशेष वर्ण, उपयोग करने के लिए, आप इसे करने से पहले एक विशेष एस्केप वर्ण डालना होगा।

उदाहरण

echo A->B 

के लिए कोई काम नहीं के बाद से '>' है '^' की सहायता से निकले जा करने के लिए होगा:

echo A-^>B 

भी escape sequences देखें। enter image description here

एक छोटी बैच फ़ाइल है, जो विशेष चरित्र और उनके बचने के दृश्यों का मूल सेट प्रिंट करती है।

+1

उत्तर अद्यतन किया गया – orbitcowboy

संबंधित मुद्दे