ऐसे तरीके हैं जो ^
से बचने के दृश्यों से बचें।
आप विलंबित विस्तार के साथ चर का उपयोग कर सकते हैं। नीचे एक छोटी बैच स्क्रिप्ट प्रदर्शन
@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 बैच पटकथा मज़ा ;-)
उद्धरण के साथ क्या गलत है? – Oskar
उद्धरण भी प्रतिबिंबित किया जाएगा। – dalle