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