Як я можу повторити новий рядок у пакетному файлі?


642

Як ви можете вставити новий рядок з вихідного файлу?

Я хочу зробити щось на кшталт:

echo hello\nworld

Який результат:

hello
world

6
Прийшов корисний для мене. Мені довелося робити відлуння \ n \ n | my_app.exe в сценарії. Я зробив (відлуння. && відлуння) | my_app.exe
Вігнеш

2
Легкий підхід "Код починається:"> echo hello & echo world, дасть вам те, що вам потрібно
prudviraj

1
Ви можете вставити невидимий ascii chr (255) в окремий рядок, що примусить новий порожній рядок. Утримуйте клавішу [alt] і натисніть 255 на клавіатурі. до цього вставляється chr (255), який є порожнім квадратом. тобто " ехо (alt + 255) " Ви можете використовувати лише клавіатуру, а не цифри у верхній частині клавіатури!
jwzumwalt

Так само, як половина ремонту комп'ютера підключає його і вмикає, половина розробки програмного забезпечення - це те, що я називаю космічною технікою . Нам потрібні наші порожні рядки просто так.
Боб Штейн

Як щодо цього? echo Yes&echo No
scientist_7

Відповіді:


462

echo hello & echo.world

Це означає, що ви можете визначити & echo.як константу для нового рядка \n.


43
приклад не потребує періоду, але вам потрібен такий, щоб повторити порожній порожній рядок:echo. && echo hello && echo. && echo world
matt wilkie

4
Чи можете ви зробити це за допомогою одного відлуння, щоб його можна було переспрямувати у файл?
Шахбаз

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB

25
Річ періоду в "відлуні". ніколи не перестає дивувати мене. Він настільки датовий, і я все одно забуваю, що крапка повинна бути суворо поєднана з назвою команди, не маючи пробілів між ними. У вашому дописі немає помилок, я пишу це лише як нагадування: "відлуння". ! = "відлуння". !
quetzalcoatl

5
@quetzalcoatl, воно стає ще більш дивним. Інші символи, крім крапки, теж працюють. SS64 каже, що кращий синтаксис - це echo(для покращення продуктивності (все ще не маючи на увазі місця). Розширене обговорення інших персонажів та їх достоїнств / недоліків в ECHO. НЕМАЄТЬСЯ надати текст або порожній рядок - Замість цього використовуйте ECHO /
matt wilkie

558

Використання:

echo hello
echo.
echo world

16
Чи можливо при наданні рядка в межах одного оператора echo?
Брайан Р. Бонді,

5
Чому це потрібно робити за допомогою однієї заяви ехо; де шкода мати іншого?
Роб

3
@Rob, я просто натрапив на цю проблему, і жодна з цих робіт не працює. Вам потрібно перегукуватись в одному твердженні на моєму прикладі. Я генерую деякі текстові файли з HTML і генерую Makefile, використовуючи " echo "Makefile contents (which has \n)" > MakefileКілька ехо", це не спрацює
Shahbaz

3
Використовуйте & (або &&), щоб зробити їх в одному заяві: Наприклад, щоб помістити "привіт \ nworld" у файл txt:(echo hello & echo world) >> ./test.txt
Нед Мартін,

4
Для багаторядкового виводу у файл, чому б просто не зробити наступне? echo line 1 > Makefileа потім echo line 2 >> Makefile. Використання >>причин призводить до того, що вихід буде доданий до файлу, що є саме поведінкою, яка вам потрібна для цього випадку.
dgnuff

141

Тут ви йдіть, створіть .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 . . .

Вам потрібен лише код між операторами REM, очевидно.


51
Дуже вражаюче, ви могли б взяти час, щоб пояснити, як працює набір ліній NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? Я не можу цілком обернути голову
Енді Морріс

8
@andy Methinks +8 коментаря Варранти на питання: stackoverflow.com/questions/6379619 / ...
матові Уїлкі

82
Це прекрасний приклад, який показує, що пакетні файли cmd.exe та Windows абсолютно божевільні!
mivk

12
ПРИМІТКА ДЛЯ САМОГО: У рядку "встановити NLM = ^" після CARET не повинно бути нічого, а після нього повинні бути 2 порожні рядки.
mnemotronic

4
Дивіться мою відповідь щодо більш простого методу. set nl=^&echo., тоді просто echo hello %nl% worldдає такий же ефект.
колтонон

96

Існує стандартна функція echo:в cmd / bat-файлах для запису порожнього рядка, який імітує новий рядок у вашому cmd-виході:

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

Вихід цитованого вище cmd-файлу:

line1

line2

37
Насправді, будь-який невживаний спеціальний чар повинен працювати. Я завжди заохочую використання / тому, що коса риса є стандартним знаком для параметрів команд. Також я завжди критикую використання точки, яку хтось із Microsoft вибирає, на жаль, тому що команда: echo.com дає різні результати залежно від версії командного процесора MS-DOS / Windows Batch.
Аакіні

21
Єдина версія, яка завжди працює - це echo(. Схоже, це може спричинити проблеми, але насправді працює прекрасно. Усі інші форми мають принаймні одну ситуацію, коли команда не виконуватиметься за бажанням.
dbenham

5
@naxa - Нічого офіційного, просто колективні знання, отримані кількома партійними хакерами. Мета полягає в тому, щоб мати синтаксис, який можна використовувати для ECHO будь-якого значення, включаючи нічого, і ніколи не турбуватися про те, щоб отримати щось інше, ніж те, що очікується. Найкраще резюме, про яке я знаю, - на doseps.com/forum/viewtopic.php?p=4554#p4554 . Це неначе залишає вас звисати, але ніхто ніколи не придумав сценарій, коли ECHO(не вдасться.
dbenham

2
@Pacerier - є приклади відмови для кожної з цих пропозицій. Уважно читайте dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham

2
@Pacerier тут достатньо відлуння для окремого питання. Можливо, щось у руслі "які персонажі можуть негайно слідувати echo, і які їх наслідки?"
matt wilkie

68

Як і відповідь Кена, але із застосуванням затримки розширення.

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

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

Спочатку створюється один символ передачі рядка та присвоюється змінній \ n.
Це працює так, як карета в кінці рядка намагається уникнути наступного символу, але якщо це Linefeed, він ігнорується, а наступний символ читається та уникається (навіть якщо це також передача рядків).
Тоді вам потрібен третій рядок для завершення поточної інструкції, інакше третій рядок буде доданий до змінної LF.
Навіть пакетні файли мають закінчення рядків з CR / LF, лише важливі значення мають LF, оскільки CR видаляються в цій фазі синтаксичного аналізу.

Перевага використання уповільненого розширення полягає в тому, що взагалі немає спеціальних режимів обробки символів.
echo Line1%LF%Line2не вдасться, оскільки аналізатор припиняє розбирати на одному каналі рядків.

Більше пояснень є в
ТА: Довгі команди розбиті на декілька рядків у пакетному файлі Vista / DOS (.bat)
ТА: Як розшифровує сценарій командного перекладача Windows (CMD.EXE)?

Редагувати: уникати echo.

Це не відповідає на запитання, оскільки питання стосувалося одинарного, echoякий може вивести кілька рядків.

Але, незважаючи на інші відповіді, які пропонують використовувати echo.для створення нового рядка, слід зазначити, що echo.це найгірше, оскільки це дуже повільно, і він може повністю вийти з ладу, оскільки cmd.exe шукає файл з ім'ям ECHOі намагається запустити його.

Для друку лише порожнього рядка ви можете використовувати один із

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

Але використання echo., echo\або echo:слід уникати, так як вони можуть бути дуже повільним, в залежності від місця , де скрипт буде виконуватися, як мережевий диск.


1
Якщо ви передасте рядок з новими рядками в якості параметра в пакетну підпрограму, наприклад call :pause line1!\n!line2, запустіть підпрограму з setlocal EnableDelayedExpansionі закінчіть її, setlocal DisableDelayedExpansionщоб запобігти інтерпретації нових рядків.
stevek_mcc

2
+1 за роль персонажів echo, echo; echo( echo/ echo+ echo=та галерею шахраїв echo. echo\ echo:. Тепер, якби ви пояснювали, чому на святому чортові ці роботи, я б вам завдячував безкоштовним пивом.
Боб Штейн

40

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

7
Не використовуйте, echo.оскільки він вперше намагається знайти файл з таким іменем. Використовуйте інші пунктуаційні знаки, такі якecho,
Відновіть Моніку

20

Коли ехо щось переспрямовує на файл, кілька команд ехо не працюватимуть. Я думаю, що, можливо, переспрямовувач ">>" - це хороший вибір:

ехо привіт> темп
світ ехо >> темп

8
Перший приклад, використовуючи ">", створить новий файл, другий, використовуючи ">>", додасть до вже наявного файлу (або створить його, якщо він ще не існує).
Ян Дюран

1
(echo hello && echo world) > tempзгаданий Натаном Дж. Брауер у коментарі до (поточної) прийнятої відповіді працює.
ГерольдБрозер повертає Моніку

15

Подібно до того, як пропонує Грімтрон - ось короткий приклад його визначення:

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

Вихідні дані

C:\>test.bat
hello
world

Це фактично відлучить додатковий новий рядок після "світу"
BlueRaja - Danny Pflughoeft

1
@blue останній рядок, здається, є функцією самого пакетного файлу. Якщо ви повторите echo hello %newline%worldрядок, між ними немає пробілів.
matt wilkie

2
echo "Hello %newline% world"не вдається, як це всередині цитат. Тому що це не справжній новий рядок.
jeb

14

Якщо вам потрібно помістити результати у файл, ви можете використовувати

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

9

Ви також можете зробити так,

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

Вихід буде,

a
b
c d

Зауважте, що коли це поміщено у пакетний файл, '%' подвоюється.

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

Це рішення також працює, якщо ви хочете повторити амперсанд & замість нового рядка.
parvus

Я думаю, що я знайшов помилку: *char

7

Якщо хтось приходить сюди, тому що вони хочуть повторити порожній рядок із файлу makeing MINGW, я використав

@cmd /c echo.

просто використання echo.викликає жахливе process_begin: CreateProcess(NULL, echo., ...) failed.повідомлення про помилку.

Я сподіваюся, що це допоможе принаймні ще одній людині там :)


Але це не питання. Downvote!
Mesalcode

Не впевнений, сарказм чи ні: Р
Уейн Урода

Дізнайтеся, заглянувши у свою поштову скриньку: D
Mesalcode

3

Якщо вам потрібно використовувати відомі \ 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 для включення знаків оклику, які розширюють змінні при виконанні. І підміняє виконання \ п з новим рядком вмісту (шукаю синтаксис в довідковому наборі ). Ми, звичайно, можемо використовувати ! Newline! під час встановлення відповіді, але \ 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 підрядки.


1
Ви по суті робите те саме, що відповідь Джеба вище.
Сквошман

Відповіді, які я прочитав вище, були дуже корисними, але мені потрібно було викликати сценарій від підпрограми, який буде розбиратись \ n, тому я б уникав виконувати трюк скрізь. Це було потрібно для вдосконалення рішення, і я поділився цим уточненням. Сподіваюся, це не завдало шкоди жодній тварині.
Томатор

2

Це працювало для мене, не потрібно затягувати розширення:

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

Він записує вихід таким чином:

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

4
-1 echo asdf >myfile.txtдасть точно такі самі результати. echoдодає новий рядок до кінця рядка.
BlueRaja - Danny Pflughoeft

2
Чудова відповідь, будучи єдиною людиною, яка визнала значення використання дужок для нових рядків. Я вважаю, що саме так створили DOS виробники.
djangofan

2

Щоб почати новий рядок у пакетному пакеті, все, що вам потрібно зробити, це додати "echo [", наприклад:

echo Hi!
echo[
echo Hello!

5
Це повільно і виходить з ладу, коли існує файл з назвоюecho[.bat
jeb

Що? Він повинен працювати негайно, а також просто видалити файл echo [.bat.
PryroTech

2
Це майже все те саме, що і відлуння. синтаксис.
PryroTech

5
Так, і echo.це погане рішення.
jeb

1
Як видно з попередніх відповідей, це спробує спочатку знайти файл на шляху, що спричинить його так повільно. Те саме стосується і для echo.. Очікування на те, що користувачі вашого сценарію видалять файли з їхньої системи лише тому, що для вашого сценарію потрібен новий рядок, для мене не виглядає як хороший дизайн.
Авель

2

Рішення Кен та Джеб добре працюють.

Але нові рядки створюються лише символом LF, і мені потрібні символи CRLF (версія Windows).

Для цього в кінці сценарію я перетворив LF в CRLF.

Приклад:

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

0

Ви можете використовувати @echo(@echo + [пробіл] + [нероздільний простір])

Примітка: нерозривний простір можна отримати за допомогою Alt + 0160

Сподіваюся, це допомагає :)

[редагувати] Хм ти маєш рацію, мені це було потрібно в Makefile, він чудово працює там. Я думаю, моя відповідь не пристосована до пакетних файлів ... Моє погано.


Я отримав ECHO ist eingeschaltet (ON).не порожній рядок, спробував у cmd-prompt
jeb

1
Це нерозривний пробіл, а не новий рядок.
Ри-

0

Це рішення працює (випробувано):

type nul | more /e /p

Це перетворює окремі канали ліній у комбінацію каналів зворотної лінії перевезення.


Але як це додає новий рядок між текстом? Йдеться проecho hello \n world
Джеб

Від мене зворотний голос. Це не відповідь на запитання
Mesalcode

-2

Я не можу зробити це простіше, ніж:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.