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

547

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

Я хочу сделать что-то вроде:

echo hello\nworld

Что бы вывести:

hello
world
  • 6
    Пригодился для меня. Я должен был сделать эхо \ n \ n | my_app.exe в скрипте. Я сделал (эхо. && эхо.) | my_app.exe
  • 2
    Простой подход «Код начинается:»> echo hello & echo world, даст вам то, что вам нужно
Показать ещё 1 комментарий
Теги:
batch-file
newline
command-line
dos

19 ответов

390
Лучший ответ

echo hello & echo.world

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

  • 12
    Также работает без периода: echo hello && echo world
  • 37
    в примере не нужен период, но он нужен для вывода пустой пустой строки: echo. && echo hello && echo. && echo world
Показать ещё 15 комментариев
486

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

echo hello
echo.
echo world
  • 12
    Возможно ли это при предоставлении строки внутри одного оператора echo?
  • 5
    Зачем вам нужно делать это с помощью одного эхо-оператора? где вред иметь другого? Я полагаю, вы не просто добавляете ненужные ограничения для удовольствия ...
Показать ещё 6 комментариев
114

Вот, пожалуйста, создайте файл .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.

  • 45
    Очень впечатляет, не могли бы вы объяснить, как работает набор строк NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? Я не могу понять
  • 1
    Увы, это не работает при передаче echo строки в другую программу.
Показать ещё 6 комментариев
92

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

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

Результат цитированного выше cmd файла:

line1

line2
  • 14
    echo, и echo. также работа
  • 35
    Фактически, любой специальный символ UNUSED должен работать. Я всегда рекомендую использовать /, потому что косая черта является стандартным символом для параметров команды. Кроме того, я всегда критикую использование точки, которую, к сожалению, выбирают в Microsoft, потому что команда echo.com дает разные результаты в зависимости от версии командного процессора MS-DOS / Windows Batch.
Показать ещё 10 комментариев
57

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

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 Command Interpreter (CMD.EXE)?

Изменить: Избегать echo.

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

Но, несмотря на другие ответы, которые предлагают использовать echo. для создания новой строки, следует отметить, что echo. является наихудшим, поскольку он очень медленный и он может полностью выйти из строя, поскольку cmd.exe ищет файл с именем echo и попытайтесь запустить его.

Для печати только пустой строки вы можете использовать один из

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

Но следует избегать использования echo., echo\ или echo:, поскольку они могут быть очень медленными, в зависимости от того, где будет выполняться script, например, сетевой диск.

  • 0
    Если вы будете передавать строку с символами новой строки в качестве параметра в пакетную подпрограмму, например, call :pause line1!\n!line2 , запустите подпрограмму с помощью setlocal EnableDelayedExpansion и завершите ее с помощью setlocal DisableDelayedExpansion чтобы не допустить преждевременной интерпретации setlocal DisableDelayedExpansion строк.
35

echo. Достаточно сказано.

Если вам нужно это в одной строке, используйте &. Например,

echo Line 1 & echo. & echo line 3

будет выводиться как:

Line 1

line 3

Теперь скажите, что вам нужно что-то немного более интересное,...

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

Выходы

hello
world

Затем просто введите %n%, когда вам нужна новая строка в выражении echo. Это ближе к вашему \n, используемому на разных языках.

Структура

set n= устанавливает переменную n равной:

^ Отбрасывает следующий символ:

& Позволяет выполнять другую команду в той же строке. Мы не заботимся об ошибке (это выражение эха для крика вслух), поэтому нет &&.

echo. Продолжает выполнение эхо-сообщения.

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

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

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

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

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

Точно так же, как предлагает Гримтрон - вот краткий пример для его определения:

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

Выход

C:\>test.bat
hello
world
  • 0
    Это на самом деле будет эхом дополнительный символ новой строки после «мира»
  • 1
    @blue завершающий перевод строки, кажется, является функцией самого пакетного файла. Если вы повторите echo hello %newline%world линию echo hello %newline%world между ними нет пробелов.
Показать ещё 1 комментарий
13

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

(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)
  • 0
    Это решение также работает, если вы хотите повторить амперсанд & вместо новой строки.
  • 0
    я думаю, что нашел ошибку: * char
6

Если кто-то приходит сюда, потому что они ищут эхо пустую строку из MINGW make makefile, я использовал

@cmd /c echo.

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

Я надеюсь, что это поможет хотя бы одному другому человеку:)

3

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

echo Hi!
echo[
echo Hello!
  • 3
    Это медленно, и это терпит неудачу, когда файл существует с именем echo[.bat
  • 0
    Какие? Он должен работать мгновенно, а также просто удалить файл echo [.bat.
Показать ещё 3 комментария
2

Решения Ken и Jeb хорошо работают.

Но новые строки генерируются только с символом LF, и мне нужны символы CRLF (версия Windows).

Для этого, в конце script, я преобразовал LF в CRLF.

Пример:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
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 добавляет новую строку в конец строки.
  • 2
    Отличный ответ, будучи единственным человеком, который признал ценность использования скобок для новых строк. Я верю, что именно так создатели DOS хотели, чтобы вы это сделали.
1

Если нужно использовать знаменитый \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 содержимым новой строки (ищите синтаксис в справочной системе). Мы могли бы, конечно, использовать! Newline! пока задаешь ответ но \n удобнее. Он может быть передан извне (попробуйте Hello R2\nD2), где никто не знает имя переменной, содержащей разрыв строки (Да, Hello C3! Newline! P0 работает так же).

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.

  • 0
    По сути, вы делаете то же самое, что и ответ Джеба выше.
  • 0
    Ответы, которые я прочитал выше, были очень полезными, но мне нужно было вызвать подпрограмму od сценария, которая будет анализировать \ n, поэтому я бы избегал реализации этого трюка везде. Это необходимо для уточнения решения, и я поделился этим уточнением. Надеюсь, это не повредило ни одному животному.
0

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

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

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

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

  • 0
    Я получил ECHO ist eingeschaltet (ON). не пустая строка, попробовал в командной строке
  • 0
    Это неразрывный пробел, а не перевод строки.
-1

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

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

Наиболее консервативный способ сделать это в системах linux - -e псевдоним -e который интерпретирует экранированные символы с обратной косой чертой.

echo -e "hello\nworld"

Вот другие примеры

  • 3
    Но вопрос не в Linux или Bash. Это про пакет Windows
  • 0
    Туш @jeb. Может быть, я должен стать более знакомым с окнами. Удивлен, почему это привело меня сюда.
-6

Я не уверен, почему люди не рекомендовали это, но echo имеет возможность включить escape-обратные экраны, что означает, что \n будет работать с echo.

Следовательно

echo -e "Hello\nWorld"

даст результат

Hello
World

Ещё вопросы

Сообщество Overcoder
Наверх
Меню