Как я могу отобразить новую строку в командном файле?

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), который является пустым квадратом. т.е. " echo (alt + 255) " Вы можете использовать только клавиатуру, а не цифры в верхней части клавиатуры Querty!
Jwzumwalt
Так же, как половина ремонта компьютеров включает и включает его, половина разработки программного обеспечения - это то, что я называю космической инженерией . Нам нужны наши пустые строки просто так.
Боб Стейн
Как насчет этого ? echo Yes&echo No
scientist_7

Ответы:

462

echo hello & echo.world

Это означает, что вы можете определить & echo.как константу для новой строки \n.

Grimtron
источник
43
в примере не нужен период, но он нужен для echo. && echo hello && echo. && echo world
вывода
4
Можете ли вы сделать это с помощью одного эха, чтобы его можно было перенаправить в файл?
Шахбаз
46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Натан JB
25
Период вещь в "эхо". никогда не перестает удивлять меня. Это так устарело, и все же я всегда забываю, что точка должна быть строго соединена с именем команды без пробелов между ними. В вашем посте нет ошибок, я пишу это просто как напоминание: «эхо». ! = "Эхо." !
Кецалькоатль
5
@quetzalcoatl, это становится еще более странным. Другие символы, кроме точки, тоже работают. В SS64 говорится, что лучший синтаксис - echo(для повышения производительности (но все же без места). Расширенное обсуждение других персонажей и их достоинств / недостатков в ECHO. Не в состоянии дать текст или пустую строку - Вместо этого используйте ECHO /
Matt Wilkie
558

Использование:

echo hello
echo.
echo world
Мэтт Лэйси
источник
16
Возможно ли это при предоставлении строки внутри одного оператора echo?
Брайан Р. Бонди
5
Почему вам нужно сделать это с помощью одного эхо-оператора; где вред иметь другого?
Роб
3
@ Роб, я только столкнулся с этой проблемой, и ни одна из этих работ. Вы должны повторить в одном утверждении в моем примере. Я генерирую некоторые текстовые файлы из HTML и создаю Makefile, используя echo "Makefile contents (which has \n)" > Makefileнесколько эхо, это не сработает
Shahbaz
3
Используйте & (или &&), чтобы сделать их в одном выражении: например, чтобы поместить «hello \ nworld» в текстовый файл:(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
ПРИМЕЧАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ: строка «set NLM = ^» не должна иметь ничего после CARET и должна иметь 2 пустых строки после нее.
мнемотроник
4
Смотрите мой ответ для более простого метода. set nl=^&echo., тогда просто echo hello %nl% worldдает тот же эффект.
Колтонон
96

В echo:cmd / bat-файлах есть стандартная функция записи пустой строки, которая эмулирует новую строку в вашем cmd-выходе:

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

Вывод приведенного выше cmd-файла:

line1

line2
macropas
источник
37
Фактически, любой специальный символ UNUSED должен работать. Я всегда рекомендую использовать /, потому что косая черта является стандартным символом для параметров команды. Кроме того, я всегда критикую использование точки, которую, к сожалению, выбирают в Microsoft, потому что команда echo.com дает разные результаты в зависимости от версии командного процессора MS-DOS / Windows.
Аасини
21
Единственная версия, которая всегда работает echo(. Похоже, это может вызвать проблемы, но на самом деле работает отлично. Все другие формы имеют по крайней мере одну ситуацию, когда команда не будет работать так, как нужно.
ДБЕНХАМ
5
@naxa - Ничего официального, просто коллективные знания, полученные несколькими хакерами. Цель состоит в том, чтобы иметь синтаксис, который можно использовать для ECHO любого значения, в том числе ничего, и никогда не беспокоиться о получении чего-либо, кроме ожидаемого. Лучшее из известных мне резюме - на dostips.com/forum/viewtopic.php?p=4554#p4554 . Это как бы оставляет вас в покое, но никто никогда не придумывал сценарий, в котором ECHO(не получается.
ДБЕНХАМ
2
@Pacerier - есть примеры неудач для каждого из этих предложений. Внимательно прочитайте dostips.com/forum/viewtopic.php?p=4554#p4554 .
Дбенхем
2
@Pacerier, здесь достаточно эха для отдельного вопроса. Возможно, что-то вроде «какие персонажи могут сразу следовать echoи каковы их эффекты?»
Мэтт Уилки
68

Как и ответ Кена, но с использованием отложенного расширения.

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

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

Сначала создается отдельный символ перевода строки и присваивается переменной \ n.
Это работает, когда каретка в конце строки пытается экранировать следующий символ, но если это перевод строки, он игнорируется, а следующий символ читается и экранируется (даже если это также перевод строки).
Затем вам нужен третий перевод строки для завершения текущей инструкции, иначе третья строка будет добавлена ​​к LF-переменной.
Даже командные файлы имеют окончание строк с CR / LF, важны только LF, так как CR удаляются на этом этапе анализатора.

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

Больше объяснений в
SO: длинные команды разбиты на несколько строк в пакетном файле Vista / DOS (.bat)
SO: Как интерпретатор сценариев команд 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 для громкого крика), поэтому нет &&необходимости.

echo. Продолжает эхо-утверждение.

Все это работает, потому что вы можете создавать переменные, которые являются кодом, и использовать их внутри других команд. Это похоже на функцию гетто, так как пакетная обработка не является самой продвинутой из языков сценариев оболочки. Это работает только потому, что в пакете плохо используются переменные, а не различие между целыми числами, символами, числами с плавающей запятой, строками и т. Д., Естественно.

Если вы хитры, вы можете заставить это работать с другими вещами. Например, используя его для отображения вкладки

set t=^&echo.     ::there are spaces up to the double colon
coltonon
источник
7
Не используйте echo.при первой попытке найти файл с таким именем. Используйте другие знаки препинания, такие какecho,
Восстановить Монику
20

При отображении чего-либо для перенаправления в файл несколько команд echo не будут работать. Я думаю, что перенаправитель «>>» - хороший выбор:

эхо привет> темп
эхо мира >> темп
Crend King
источник
8
Первый пример, используя «>», создаст новый файл, второй, используя «>>», добавит к существующему файлу (или создаст его, если он еще не существует).
Янн Дюран
1
(echo hello && echo world) > tempупомянутый Натаном Дж. Брауэром в комментарии к (текущему) принятому ответу работ.
GeroldBroser восстанавливает Монику
15

Точно так же, как предлагает Grimtron - вот быстрый пример, чтобы определить это:

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

Вывод

C:\>test.bat
hello
world
Питер Мортенсен
источник
Это на самом деле перекликается с дополнительной новой
строкой
1
@blue завершающий перевод строки, кажется, является функцией самого пакетного файла. Если вы повторите echo hello %newline%worldстроку, между ними нет пробелов.
Мэтт Уилки
2
echo "Hello %newline% world"терпит неудачу, поскольку это находится внутри кавычек. Потому что это не настоящий перевод строки.
Джеб
14

Если вам нужно поместить результаты в файл, вы можете использовать

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
test30
источник
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

Если кто-нибудь приходит сюда, потому что он хочет повторить пустую строку из make-файла MINGW, я использовал

@cmd /c echo.

просто используя echo.причины страшныеprocess_begin: CreateProcess(NULL, echo., ...) failed. сообщение об ошибке.

Я надеюсь, что это поможет по крайней мере еще одному человеку там :)

Уэйн Урода
источник
Но это не вопрос. Downvote!
Mesalcode
Не уверен, сарказм или нет: P
Уэйн Урода
Узнайте, посмотрев в свой почтовый ящик: 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.

Tomator
источник
1
По сути, вы делаете то же самое, что и ответ Джеба выше.
Сквошман
Ответы, которые я прочитал выше, были очень полезными, но мне нужно было вызвать подпрограмму od сценария, которая будет анализировать \ 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 . . .
NahuelGQ
источник
4
-1 echo asdf >myfile.txtдаст те же результаты. echoдобавляет новую строку в конец строки.
BlueRaja - Дэнни Пфлюгофт
2
Отличный ответ, будучи единственным человеком, который признал ценность использования скобок для новых строк. Я верю, что именно так создатели DOS хотели, чтобы вы это сделали.
Джангофан
2

Чтобы начать новую строку в пакете, все, что вам нужно сделать, это добавить "echo [", вот так:

echo Hi!
echo[
echo Hello!
PryroTech
источник
5
Это медленно и не удается, когда файл существует с именемecho[.bat
Jeb
Какая? Он должен работать мгновенно, а также просто удалить файл echo [.bat.
PryroTech
2
Это почти то же самое, что и эхо. синтаксис.
PryroTech
5
Да и echo.тоже плохое решение.
Джеб
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
otaviodecampos
источник
0

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

Примечание: незащищенное пространство можно получить с помощью Alt + 0160

Надеюсь, поможет :)

[править] Хм, вы правы, мне нужно было это в Makefile, там он отлично работает. Я думаю, мой ответ не адаптирован для пакетных файлов ... Мой плохой.

Йохан д
источник
Я получил ECHO ist eingeschaltet (ON).не пустую строку, попробовал в cmd-приглашение
Джеб
1
Это неразрывный пробел, а не перевод строки.
Ry-
0

Это решение работает (проверено):

type nul | more /e /p

Это преобразует отдельные строки перевода в комбинацию перевода строки возврата каретки.

Васиф хасан
источник
Но как это добавляет новую строку между текстом? Вопрос оecho hello \n world
Джеб
Даунвот от меня. Это не ответ на вопрос
Mesalcode
-2

Я не могу сделать это проще, чем:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
strance
источник