windows बैच फ़ाइलों में आप एक नई लाइन कैसे प्रतिबिंबित कर सकते हैं?




batch-file command-line (14)

आप अपने बैच फ़ाइल आउटपुट से एक नई लाइन कैसे डाल सकते हैं?

मैं कुछ ऐसा करना चाहता हूं:

> echo hello\nworld

जो आउटपुट होगा:

नमस्ते
विश्व


यहां आप निम्न में से एक .bat फ़ाइल बनाते हैं:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

आपको आउटपुट को निम्न जैसा देखना चाहिए:

There should be a newline
inserted here.

Press any key to continue . . .

आपको केवल आरईएम स्टेटमेंट्स के बीच कोड की आवश्यकता है, जाहिर है।


आप यह भी कर सकते हैं,

(for %i in (a b "c d") do @echo %~i)

आउटपुट होगा,

a
b
c d

ध्यान दें कि जब इसे बैच फ़ाइल में रखा जाता है, तो '%' दोगुना हो जाएगा।

(for %%i in (a b "c d") do @echo %%~i)

यदि किसी को स्ट्रिंग अक्षर में प्रसिद्ध \ n का उपयोग करने की आवश्यकता है जिसे एक चर में पास किया जा सकता है, तो नीचे दिए गए Hello.bat स्क्रिप्ट में एक कोड लिख सकता है:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

इस तरह मल्टीलाइन आउटपुट एक ही स्थान पर तैयार किया जा सकता है, यहां तक ​​कि अन्य स्क्रिप या बाहरी फ़ाइल में भी, और दूसरे में मुद्रित किया जा सकता है।

लाइन ब्रेक न्यूलाइन वैरिएबल में आयोजित किया जाता है। इको लाइन का विस्तार होने के बाद इसका मान प्रतिस्थापित किया जाना चाहिए, इसलिए मैं निष्पादन पर चर का विस्तार करने वाले विस्मयादिबोधक संकेतों को सक्षम करने के लिए setlocal enableDelayedExpansion का उपयोग करता हूं। और निष्पादन \ n न्यूलाइन सामग्री के साथ विकल्प \ n ( मदद सेट पर वाक्यविन्यास के लिए देखो)। हम निश्चित रूप से उपयोग कर सकते हैं ! Newline! उत्तर सेट करते समय \ n अधिक सुविधाजनक है। इसे बाहर से पारित किया जा सकता है ( हैलो आर 2 \ n डी 2 आज़माएं ), जहां कोई भी लाइन ब्रेक धारण करने वाले चर के नाम को नहीं जानता (हां, हैलो सी 3! न्यूलाइन! पी 0 वैसे ही काम करता है)।

उपर्युक्त उदाहरण को call:mlecho Hi\nI'm your comuter या स्टैंडअलोन बैच के लिए परिष्कृत किया जा सकता है, जैसे call:mlecho Hi\nI'm your comuter :

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

कृपया ध्यान दें, कि अतिरिक्त बैकस्लैश स्क्रिप्ट को पार्सिंग \ n सबस्ट्रिंग से नहीं रोकेगा।


echo hello & echo.world

इसका मतलब है कि आप परिभाषित & echo. सकते हैं & echo. एक नई लाइन के लिए निरंतर के रूप में \n


बैच में एक नई लाइन शुरू करने के लिए, आपको बस इतना करना है कि "echo [" जोड़ें, जैसे:

echo Hi!
echo[
echo Hello!

किसी फ़ाइल पर रीडायरेक्ट करने के लिए कुछ गूंजते समय, एकाधिक इको कमांड काम नहीं करेंगे। मुझे लगता है कि शायद ">>" पुनर्निर्देशक एक अच्छी पसंद है:

echo hello > temp
echo world >> temp

केन और जेब समाधान अच्छी तरह से काम करता है।

लेकिन नई लाइनें केवल एक एलएफ चरित्र के साथ उत्पन्न होती हैं और मुझे सीआरएलएफ पात्रों (विंडोज संस्करण) की आवश्यकता होती है।

इसके लिए, लिपि के अंत में, मैंने एलएफ को सीआरएलएफ में परिवर्तित कर दिया है।

उदाहरण:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt

echo. पर्याप्त कथन।

यदि आपको इसे एक पंक्ति में चाहिए, तो & उपयोग करें। उदाहरण के लिए,

echo Line 1 & echo. & echo line 3

के रूप में उत्पादन होगा:

Line 1

line 3

अब, कहें कि आप कुछ फैनसीयर चाहते हैं ...

set n=^&echo.
echo hello %n% world

आउटपुट

hello
world

फिर जब भी आप गूंज कथन में एक नई पंक्ति चाहते हैं तो %n% में फेंक दें। यह आपके \n विभिन्न भाषाओं में उपयोग किए जाने के करीब है।

टूट - फूट

set n= वैरिएबल n बराबर सेट करता है:

^ अगले प्रतीक को आगे बढ़ाने के लिए बाहर निकलता है:

& एक ही पंक्ति पर एक और आदेश करने का मतलब है। हमें त्रुटि के बारे में परवाह नहीं है (यह जोर से रोने के लिए एक गूंज कथन है), इसलिए कोई && की आवश्यकता नहीं है।

echo. गूंज कथन जारी रखता है।

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

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

set t=^&echo.     ::there are spaces up to the double colon

आप @echo (@echo + [space] + [insecable space] का उपयोग कर सकते हैं)

नोट: असुरक्षित स्थान Alt + 0160 के साथ प्राप्त किया जा सकता है

आशा करता हूँ की ये काम करेगा :)

[संपादित करें] हम्म आप सही हैं, मुझे इसे मेकफ़ाइल में चाहिए, यह वहां पूरी तरह से काम करता है। मुझे लगता है कि मेरा जवाब बैच फ़ाइलों के लिए अनुकूलित नहीं है ... मेरा बुरा।


यह मेरे लिए काम किया, कोई देरी विस्तार आवश्यक:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

यह इस तरह के आउटपुट लिखता है:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

केन के जवाब की तरह, लेकिन देरी विस्तार के उपयोग के साथ।

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

पहले एक सिंगल लाइनफीड वर्ण बनाया गया है और \ n-variable को असाइन किया गया है।
यह लाइन के अंत में कैरेट के रूप में काम करता है, अगले चरित्र से बचने की कोशिश करता है, लेकिन यदि यह एक लाइनफीड है तो इसे अनदेखा किया जाता है और अगला चरित्र पढ़ा जाता है और बच जाता है (भले ही यह एक लाइनफीड भी हो)।
फिर आपको वर्तमान निर्देश को समाप्त करने के लिए तीसरे लाइनफ़ीड की आवश्यकता है, अन्यथा तीसरी पंक्ति को एलएफ-वेरिएबल में जोड़ा जाएगा।
यहां तक ​​कि बैच फ़ाइलों में सीआर / एलएफ के साथ लाइन एंडिंग भी होती है, केवल एलएफ महत्वपूर्ण हैं, क्योंकि सीआर को पार्सर के इस चरण में हटा दिया जाता है।

देरी से विस्तार का उपयोग करने का लाभ यह है कि कोई विशेष चरित्र हैंडलिंग बिल्कुल नहीं है।
echo Line1%LF%Line2 विफल हो जाएगा, क्योंकि पार्सर एकल लाइनफ़ीड्स पर पार्सिंग बंद कर देता है।

अधिक स्पष्टीकरण हैं
SO: Vista / DOS बैच (.bat) फ़ाइल में कई पंक्तियों पर लंबे आदेश विभाजित होते हैं
SO: विंडोज कमांड इंटरप्रेटर (सीएमडी.एक्सईई) पार्स स्क्रिप्ट कैसे करता है?

संपादित करें: echo. बचें echo.

यह सवाल का जवाब नहीं देता है, क्योंकि प्रश्न एकल echo बारे में था जो कई लाइनों को आउटपुट कर सकता है।

लेकिन अन्य उत्तरों के बावजूद जो echo. के उपयोग का सुझाव देते हैं echo. एक नई लाइन बनाने के लिए, यह ध्यान दिया जाना चाहिए कि echo. सबसे खराब है, क्योंकि यह बहुत धीमा है और यह पूरी तरह विफल हो सकता है, क्योंकि cmd.exe ECHO नाम की एक फ़ाइल की खोज करता है और इसे शुरू करने का प्रयास करता है।

केवल एक खाली रेखा छपाई के लिए, आप इनमें से एक का उपयोग कर सकते हैं

echo,
echo;
echo(
echo/
echo+
echo=

लेकिन echo. का उपयोग echo. , echo\ या echo: से बचा जाना चाहिए, क्योंकि वे वास्तव में धीमे हो सकते हैं, उस स्थान के आधार पर जहां स्क्रिप्ट निष्पादित की जाएगी, जैसे नेटवर्क ड्राइव।


अगर कोई यहां आता है क्योंकि वे एक एमआईएनडब्ल्यू से रिक्त रेखा को गूंजने की तलाश में हैं, तो मेकफ़ाइल बनाते हैं, मैंने उपयोग किया

@cmd /c echo.

बस echo. का उपयोग कर echo. process_begin: CreateProcess(NULL, echo., ...) failed. कारण बनता है process_begin: CreateProcess(NULL, echo., ...) failed. त्रुटि संदेश।

मुझे उम्मीद है कि यह कम से कम एक अन्य व्यक्ति को वहां मदद करता है :)


यदि आपको किसी फ़ाइल को परिणाम देने की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं

(echo a & echo. & echo b) > file_containing_multiple_lines.txt

जैसे Grimtron सुझाव देता है - यहां इसे परिभाषित करने के लिए एक त्वरित उदाहरण है:

@echo off
set newline=^& echo.
echo hello %newline%world

उत्पादन

C:\>test.bat
hello
world




dos