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

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

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

> echo hello\nworld

что бы выход:

привет
мир

18 ответов


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, очевидно.


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

@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 (.летучая мышь) файл
Итак: как работает интерпретатор команд Windows (CMD.EXE) разбирать скрипты?

Edit: Избегайте echo.

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

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

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

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

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


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 равен:

^ обнуляет следующий символ, чтобы следовать:

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

echo. продолжает заявление echo.

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

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

set t=^&echo.     ::there are spaces up to the double colon

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

echo hello > temp
echo world >> temp

Как и предлагает Grimtron-вот краткий пример, чтобы определить его:

@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).

для этого в конце скрипта я преобразовал LF в CRLF.

пример:

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

Если нужно использовать известные \ n в строковых литералах, которые могут быть переданы переменной, может написать код, как в Здравствуйте.летучая мышь!--5--> скрипт ниже:

@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!%

таким образом, многострочный вывод может быть подготовлен в одном месте, даже в другом scritpt или внешнем файле, и напечатан в другом.

разрыв линии удерживается в newline переменной. Его значение должно быть заменено после the Эхо линия расширена, поэтому я использую setlocal enableDelayedExpansion чтобы включить восклицательные знаки, которые расширяют переменные при выполнении. А казнь подменяет \n С newline содержание (ищите синтаксис в help set). Конечно, мы могли бы использовать !новой строки! при установке ответ но \n более удобный. Он может передаваться извне (try Привет Р2\величина nd2), где никто не знает имя переменной, содержащей разрыв линии (да,Привет C3!новой строки!Р0 работает так же).

выше пример может быть уточнен до подпрограммы или автономного пакета, используемого как call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

обратите внимание, что дополнительная обратная косая черта не помешает скрипту анализировать \ N подстроку.


можно использовать @echo ( @Эхо + [пробел] + [insecable пробел] )

Примечание: insecable пространства могут быть получены с помощью Alt+0160

надеюсь, что это помогает :)

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


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

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

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

echo -e "hello\nworld"

здесь другие примеры