एक विंडोज कमांड प्रॉम्प्ट में कोण कोष्ठक से बच


93

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

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

लेकिन फिर मेरी फाइल में डबल कोट्स हैं जो मुझे नहीं चाहिए।

कोष्ठक से बचना ala unix काम नहीं करता है:
echo some string \< with angle \> brackets >>myfile.txt

विचार?


6
उद्धरण भी गूंजेंगे।
१०:१२

जवाबों:


171

किसी कारण से Windows एस्केप वर्ण ^ है।

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

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

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

2
बहुत अच्छा काम करता है! echo some string ^< with angle ^> brackets >>conपरिणाम: कुछ स्ट्रिंग <कोण> कोष्ठक के साथ
रॉस ब्रैडबरी

1
सभी क्योंकि मूल पीसी-डॉस ने पथ और पिछड़े संगतता के लिए बैकस्लैश का उपयोग किया था।
जहमीम

मुझे लगता है कि यह सब यादृच्छिक नहीं था। मेरा अनुमान है कि वे एक ऐसे चरित्र का उपयोग करना चाहते थे जो सामान्य पाठ में दिखाई देने की संभावना नहीं थी, ताकि यह आसानी से परिहार्य न हो, लेकिन अवांछित, चरित्र बच जाता है।
डेविड ए। ग्रे

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>

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


1
मेरे जवाब के दूसरे भाग को देखें कि पाइप के लिए कई पलायन की आवश्यकता क्यों है।
डेबनहम

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

8

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

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

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

या आप एक / F लूप का उपयोग कर सकते हैं। कमांड लाइन से:

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

या एक बैच स्क्रिप्ट से:

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

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


sin3.14 बताते हैं कि पाइप को कई पलायन की आवश्यकता हो सकती है । उदाहरण के लिए:

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

कारण पाइप को कई पलायन की आवश्यकता होती है क्योंकि पाइप के प्रत्येक पक्ष को एक नई सीएमडी प्रक्रिया में निष्पादित किया जाता है, इसलिए लाइन को कई बार पार्स किया जाता है। देखें कि कोड के पाइप ब्लॉक के अंदर विस्तार में देरी क्यों विफल हो जाती है? विंडो के पाइप कार्यान्वयन के कई अजीब परिणामों की व्याख्या के लिए।

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

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 .

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

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

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

Aint बैच स्क्रिप्टिंग मज़ा ;-)


3

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

उदाहरण के लिए

echo A->B

कोई काम नहीं करेगा क्योंकि '>' को '^' से बचना होगा:

 echo A-^>B

बच के क्रम भी देखें । यहां छवि विवरण दर्ज करें

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


0

कोष्ठक से बचना ala unix काम नहीं करता है:

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

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


2
वर्तमान ड्राइव अक्षर के सापेक्ष पूर्ण पथनाम ...;)
'31

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

1
यह उत्तर, संयुक्त रूप से अस्पष्ट, प्रश्न
G- के

-2

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

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

4
वह काम नहीं करता। echo some string "<" with angle ">" brackets >>conपरिणाम: कुछ स्ट्रिंग "<" कोण के साथ ">" कोष्ठक लेकिन ओपी को कुछ स्ट्रिंग चाहिए <कोण के साथ> कोष्ठक
रॉस ब्रैडबरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.