windows - ملفات - طريقة تثبيت الخطوط




كيف يمكنك صدى خط جديد في الملفات الدفعية؟ (12)

كيف يمكنك إدراج سطر جديد من إخراج ملف دفعي؟

أريد أن أفعل شيئًا مثل:

> echo hello\nworld

التي من شأنها إخراج:

مرحبا
العالمية


إذا احتاج المرء إلى استخدام مشهورة \ 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!%

وبهذه الطريقة ، يمكن إخراج متعدد الأسطر عن طريق تحضيره في مكان واحد ، حتى في أي ملف خارجي أو آخر ، وطباعته في مكان آخر.

يقام فاصل الأسطر في متغير newline . يجب استبدال قيمته بعد توسيع خط الصدى حتى أستخدم setlocal enableDelayedExpansion لتمكين علامات التعجب التي توسع المتغيرات عند التنفيذ. ويستبدل تنفيذ \ n بمحتويات السطر الجديد (ابحث عن بناء الجملة في مجموعة المساعدة ). يمكننا بالطبع استخدام ! أثناء إعداد الإجابة ولكن \ n أكثر ملاءمة. قد يتم تمريره من الخارج (حاول Hello R2 \ nD2 ) ، حيث لا أحد يعرف اسم المتغير الذي يحمل فاصل الأسطر (نعم ، Hello C3! newline! P0 يعمل بنفس الطريقة).

قد يتم تنقيح المثال أعلاه إلى روتين فرعي أو مجموعة مستقلة ، تستخدم مثل call:mlecho Hi\nI'm your comuter :

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


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

الرجاء ملاحظة أن شرطة مائلة عكسية إضافية لن تمنع البرنامج النصي من تحليل \ n سلسلة فرعية.


إذا كان أي شخص يأتي هنا لأنهم يتطلعون إلى صدى خط فارغ من MINGW جعل makefile ، اعتدت

@cmd /c echo.

ببساطة باستخدام echo. يتسبب في عملية process_begin: CreateProcess(NULL, echo., ...) failed. رسالة خطأ.

آمل أن يساعد هذا شخص واحد على الأقل هناك :)


استعمال:

echo hello
echo.
echo world

تعمل حلول كين وجيب بشكل جيد.

ولكن يتم إنشاء خطوط جديدة بحرف LF فقط وأحتاج أحرف CRLF (إصدار Windows).

إلى هذا ، في نهاية البرنامج النصي ، قمت بتحويل LF إلى CRLF.

مثال:

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

عند تكرار شيء لإعادة التوجيه إلى ملف ، لن تعمل أوامر echo متعددة. أعتقد ربما "red" معيد التوجيه هو خيار جيد:

echo hello > temp
echo world >> temp

لا يمكنني جعله أبسط من:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

مثل إجابة كين ، ولكن مع استخدام التوسع المتأخر.

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

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

أولاً ، يتم إنشاء حرف تغذية مفردة وتعيينه إلى \ n-variable.
يعمل هذا عندما يحاول حرف الإقحام في نهاية السطر الهروب من الحرف التالي ، ولكن إذا كان هذا هو Linefeed يتم تجاهله ويتم قراءة الحرف التالي وإفلاته (حتى إذا كانت هذه هي تغذية).
ثم تحتاج إلى تغذية ثالثة لإنهاء التعليمة الحالية ، وإلا سيتم إلحاق السطر الثالث بمتغير LF.
حتى الملفات الدفعية لها نهايات سطر مع CR / LF فقط LF مهمة ، حيث تتم إزالة CR's في هذه المرحلة من المحلل اللغوي.

وتتمثل ميزة استخدام التوسع المتأخر في عدم وجود معالجة خاصة للشخصية على الإطلاق.
echo Line1%LF%Line2 قد تفشل ، حيث يتوقف المحلل اللغوي عن التحليل في linefeeds واحدة.

مزيد من التفسيرات في
SO: أوامر طويلة الانقسام عبر خطوط متعددة في ملف دفعي (.bat) Vista / DOS
SO: كيف البرامج النصية تحليل الأوامر مترجم Windows (CMD.EXE)؟

تحرير: تجنب echo.

هذا لا يجيب على السؤال ، حيث كان السؤال حول echo واحد يمكنه إخراج خطوط متعددة.

لكن على الرغم من الإجابات الأخرى التي تقترح استخدام echo. لإنشاء خط جديد ، تجدر الإشارة إلى أن echo. هو الأسوأ ، لأنه بطيء جدًا ويمكن أن يفشل تمامًا ، حيث يبحث cmd.exe عن ملف يدعى ECHO ويحاول تشغيله.

لطباعة سطر فارغ فقط ، يمكنك استخدام واحدة من

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

لكن استخدام echo. أو echo\ echo: يجب تجنبه ، حيث يمكن أن يكون بطيئًا جدًا ، اعتمادًا على الموقع الذي سيتم فيه تنفيذ النص البرمجي ، مثل محرك أقراص الشبكة.


هذا العمل بالنسبة لي ، لا حاجة للتوسع المتأخر:

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

يكتب الإخراج مثل هذا:

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

هناك echo: ميزة قياسية echo: في ملفات cmd / bat- لكتابة سطر فارغ ، والذي يحاكي سطر جديد في إخراج cmd الخاص بك:

@echo off
@echo line1
@echo:
@echo line2

إخراج المذكور أعلاه cmd-file:

line1

line2

يمكنك أيضًا القيام بهذا ،

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

سيكون الناتج ،

a
b
c d

لاحظ أنه عند وضع هذا في ملف دفعي ، يجب مضاعفة "٪".

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

echo hello & echo.world

هذا يعني أنه يمكنك تحديد & echo. كثابت لخط جديد \n .


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 يساوي:

^ Nulls out the next symbol to follow:

& يعني القيام بأمر آخر على نفس السطر. نحن لا نهتم بـ errorlevel (بيان الصدى الخاص به للبكاء بصوت عال) ، لذلك لا حاجة إلى && .

echo. يستمر بيان صدى.

كل هذا يعمل لأنه يمكنك بالفعل إنشاء المتغيرات التي هي رمز ، واستخدامها داخل الأوامر الأخرى. وهو يشبه وظيفة الغيتو ، حيث أن الدفعة ليست هي الأكثر تطوراً من لغات البرمجة النصية. هذا يعمل فقط لأن استخدام الدفعة متفاوتة من الدفعة ، وليس تحديد بين ints ، chars ، floats ، strings ، إلخ بشكل طبيعي.

إذا كنت مهنيا ، يمكنك الحصول على هذا للعمل مع أشياء أخرى. على سبيل المثال ، استخدمها لتردد علامة تبويب

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




dos