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

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

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

echo hello\nworld

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

hello
world

Ответы [ 18 ]

506 голосов
/ 25 сентября 2008

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

echo hello
echo.
echo world
427 голосов
/ 25 сентября 2008

echo hello & echo.world

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

126 голосов
/ 06 ноября 2008

Итак, создайте файл .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, очевидно.

93 голосов
/ 26 июня 2010

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

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

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

line1

line2
59 голосов
/ 17 июня 2011

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

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:, поскольку они могут быть очень медленными, в зависимости от места, где будет выполняться сценарий, например, сетевой диск.

37 голосов
/ 17 июля 2014

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 для громкого крика), поэтому && не требуется.

echo. Продолжает выражение echo.

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

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

set t=^&echo.     ::there are spaces up to the double colon
19 голосов
/ 09 августа 2009

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

echo hello > temp
echo world >> temp
15 голосов
/ 05 марта 2010

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

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

выход

C:\>test.bat
hello
world
13 голосов
/ 02 сентября 2014

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

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
9 голосов
/ 20 сентября 2011

Вы также можете сделать это,

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

Вывод будет,

a
b
c d

Обратите внимание, что когда это помещается в пакетный файл, значение '%' должно быть удвоено.

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