2011-01-10 8 views
23

Long commands split over multiple lines in Windows Vista batch (.bat) file में उल्लिखित ^ का उपयोग करके विंडोज बैच फ़ाइलों में लंबे आदेशों को कई पंक्तियों में विभाजित किया जा सकता है।विंडोज बैच फ़ाइल में दो पंक्तियों में डबल कोटेड लाइन को कैसे विभाजित करें?

हालांकि, यदि देखभाल दोहरी उद्धृत स्ट्रिंग के अंदर है, तो यह काम नहीं करेगा। उदाहरण के लिए:

echo "A very long line I want to^
split into two lines" 

यह "A very long line I want to ^ प्रिंट और मुझे बताओ कि split एक अज्ञात आदेश है जाएगा।

क्या इसके आसपास जाने का कोई तरीका है?

उत्तर

18

मुझे तीन संभावित कामकाज दिखाई देते हैं।

1) एकाधिक पैरामीटर के संयोजन के लिए लाइन का निर्माण।

@echo off 
SETLOCAL EnableDelayedExpansion 

set "line=" 
for %%a in ("line1" 
"line2" 
"line3" 
"line4" 
) do set line=!line!%%~a 
echo !line! 

2), प्रत्येक पंक्ति

@echo on 
SETLOCAL EnableDelayedExpansion 

set "line=line1 & x#"^ 
"line2 & a#"^ 
"line3 & b #"^ 
"line4 & c " 

set "line=!line:#" "=!" 
echo !line! 

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

संपादित जोड़ा गया: 3) गायब उद्धरण

setlocal EnableDelayedExpansion 
echo "A very long line I want to !"=!^ 
split into two lines" 

मेरी राय में इस सबसे अच्छा तरह से, यह काम करता है के रूप में पार्सर पहले उद्धरण देख सकते हैं और इसलिए पिछले कैरट काम करेंगे यह के रूप में, है लगता है उद्धरण के बाहर होना प्रतीत होता है।
लेकिन यह !"=! अभिव्यक्ति "= नामक चर का विस्तार करेगी, लेकिन ऐसा एक चर नाम मौजूद नहीं हो सकता है (एक बराबर चिह्न केवल पहले वर्ण के रूप में हो सकता है) ताकि यह कुछ भी न हो।

आप सुरक्षित अभिव्यक्तियों को भी बना सकते हैं, वे हमेशा कोट्स से बाहर निकल जाएंगे, अगर कोई उद्धरण है या लाइन में नहीं है।
!"^"=!

echo This multiline works !"^"=!^ 
as expected 
echo "This multiline works !"^"=!^ 
too" 

आप देरी विस्तार से बचने चाहते हैं, आप भी एक -किसी-लूप की तरह

for %%^" in ("") do (
echo "This multiline works %%~"^ 
too" 
) 
+0

उत्तर सरल नहीं है, लेकिन ये कुछ शांत चाल हैं! काश मैं कई upvotes हो सकता है। धन्यवाद! –

+0

मुझे वास्तव में वास्तव में विधि # 1 पसंद है। क्या उस विधि पर कोई गॉचा है? – djangofan

+0

यह '*? 'जैसे वर्णों में विफल रहता है, और क्योंकि लूप उन्हें वाइल्डकार्ड के रूप में उपयोग करने का प्रयास करता है। लेकिन फिर आप एक फोर/एफ लूप पर स्विच कर सकते हैं – jeb

7

सबसे सीधे आगे जवाब है का उपयोग उद्धरण से बचने के लिए कर सकते हैं। उन्हें मुद्रित किया जाएगा, लेकिन जहां तक ​​सीएमडी.एक्सईई का संबंध है, वे सामग्री को कार्यात्मक रूप से उद्धृत नहीं करेंगे। के बाद से वे अब कार्यात्मक उद्धृत कर रहे हैं

@echo off 
echo ^"A very long line I want to^
split into two lines^" 

कोई विशेष वर्ण हैं जो पंक्ति में प्रदर्शित भी भाग निकले किया जाना चाहिए।

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^ ^& ^| ^> ^< ^" 

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

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^^
& ^| ^> ^< ^" 
+1

+1, लेकिन मैं गायब उद्धरणों को प्राथमिकता देता हूं, क्योंकि आपको विशेष वर्णों से बचने की आवश्यकता नहीं है – jeb

+0

मुझे गायब उद्धरण बेहतर भी पसंद है :-) – dbenham

+0

जब तक आप जानते हैं कि देखभाल बचने वाला चरित्र है, मुझे लगता है कि यह तकनीक है याद रखना बहुत आसान है। देरी से विस्तार को समझने/सक्षम करने की आवश्यकता नहीं है, न ही एक देरी विस्तार * हैक * को समझ/याद रखें। लेकिन प्रत्येक उसके अपने के लिए। –

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