Как вы можете вставить новую строку из вывода командного файла?
Я хочу сделать что-то вроде:
echo hello\nworld
Что бы вывести:
hello
world
Как вы можете вставить новую строку из вывода командного файла?
Я хочу сделать что-то вроде:
echo hello\nworld
Что бы вывести:
hello
world
echo hello & echo.world
Это означает, что вы можете определить & echo.
в качестве константы для новой строки \n
.
Использование:
echo hello
echo.
echo world
Вот, пожалуйста, создайте файл .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.
В cmd/bat файлах есть стандартная функция echo:
для записи пустой строки, которая эмулирует новую строку в вашем cmd-выходе:
@echo off
@echo line1
@echo:
@echo line2
Результат цитированного выше cmd файла:
line1
line2
Как и ответ Кена, но с использованием отложенного расширения.
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, например, сетевой диск.
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
При повторении чего-либо для перенаправления на файл несколько команд эха не будут работать. Я думаю, возможно, редиректор " → " - хороший выбор:
echo hello > temp echo world >> temp
Точно так же, как предлагает Гримтрон - вот краткий пример для его определения:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
Если вам нужно поместить результаты в файл, вы можете использовать
(echo a & echo. & echo b) > file_containing_multiple_lines.txt
Вы также можете сделать это,
(for %i in (a b "c d") do @echo %~i)
Выход будет
a
b
c d
Обратите внимание, что когда это помещается в пакетный файл, "%" должно быть удвоено.
(for %%i in (a b "c d") do @echo %%~i)
Если кто-то приходит сюда, потому что они ищут эхо пустую строку из MINGW make makefile, я использовал
@cmd /c echo.
просто используя echo.
вызывает ужасное сообщение об ошибке process_begin: CreateProcess(NULL, echo., ...) failed.
.
Я надеюсь, что это поможет хотя бы одному другому человеку:)
Чтобы запустить новую строку в пакетном режиме, все, что вам нужно сделать, это добавить "echo [", например:
echo Hi!
echo[
echo Hello!
Это сработало для меня, не требовалось замедленного расширения:
@echo off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
Он записывает вывод следующим образом:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
Решения 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
Если нужно использовать знаменитый \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.
Вы можете использовать @echo
(@echo + [пробел] + [неопределенное пространство])
Примечание. Невозможное пространство можно получить с помощью Alt + 0160
Надеюсь, это поможет:)
[править] Хм, ты прав, мне нужно было это в Makefile, он отлично работает там. Я думаю, мой ответ не адаптирован для пакетных файлов... Мой плохой.
Я не могу сделать это проще:
echo echo hello^&echo world^&pause>silly.bat
call silly.bat
Наиболее консервативный способ сделать это в системах linux - -e
псевдоним -e
который интерпретирует экранированные символы с обратной косой чертой.
echo -e "hello\nworld"
Вот другие примеры
Я не уверен, почему люди не рекомендовали это, но echo
имеет возможность включить escape-обратные экраны, что означает, что \n
будет работать с echo
.
Следовательно
echo -e "Hello\nWorld"
даст результат
Hello
World