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

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

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

echo hello\nworld

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

hello
world

30 ответов

Решение

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-выходе:

@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 (CMD.EXE) анализирует сценарии?

Редактировать: избегатьecho.

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

Но, несмотря на другие ответы, кто предлагает использовать echo. чтобы создать новую линию, следует отметить, что echo. является худшим, так как он очень медленный и может полностью потерпеть неудачу, так как cmd.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% всякий раз, когда вы хотите новую строку в выражении эха. Это ближе к вашему \n используется на разных языках.

Сломать

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

^ Обнуляет следующий символ:

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

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

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

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

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

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

эхо привет> темп
эхо мира >> темп

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

(echo a & echo. & echo b) > file_containing_multiple_lines.txt

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

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

Выход

C:\>test.bat
hello
world

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

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

Выход будет,

a
b
c d

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

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

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

@cmd /c echo.

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

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

К новой строке добавить точку.сразу послеecho:

      echo.

После бессонной ночи и после прочтения всех ответов здесь, после прочтения большого количества SS64> CMD и после множества попыток и ошибок я нашел:

(Почти) окончательное решение

TL;DR

... для первых пользователей.

      :: Escape character - useful for color codes when 'echo'ing
:: See https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#text-formatting
set ESC=

О цветах см. также https://imgur.com/a/EuNXEar и https://gist.github.com/gerib/f2562474e7ca0d3cda600366ee4b8a45.

2-е дополнительное преимущество: легкое получение символов Unicode

Отличная страница для получения 87461 символа Unicode (AToW) по ключевым словам: https://www.amp-what.com/.

Причины

  • Версия в ответе Кена, по- видимому, работает (я не пробовал), но как-то... ну... вы видите:

            set NLM=^
    
    
    set NL=^^^%NLM%%NLM%^%NLM%%NLM%
    
  • Версия получена из ответов user2605194 и user287293 (без чего-либо между ' =' а также ' ^'):

            set nl=^&echo:
    set \n=^&echo:
    

    работает частично, но не работает с переменной в начале строки, которую необходимо изменить:

            > echo %\n%Hello%\n%World!
    echo   & echo:Hello & echo:World!
    echo is ON.
    Hello
    World
    

    из-за пустого аргумента для первого .

  • Все остальные в той или иной степени используют три echoс явно.

  • Мне нравятся короткие остроты.

История позади

Предотвращать set \n=^&echo:предлагается в ответах здесь повторять пустое (и такое печатание его статуса). Я впервые вспомнил пользователя Alt+255со времен, когда Novell была широко используемой сетью и использовались кодовые страницы, такие как 437 и 850 . Но 0d255/0xFF — это ›Ÿ‹ (латинская строчная буква Y с диэрезисом) в Unicode в настоящее время.

Потом я вспомнил, что в больше пробелов , чем в обычном 0d32/0x20, но все они считаются пробелами и ведут к тому же поведению, что и ›␣‹. Юникоде

Но есть даже больше: пробелы нулевой ширины и соединения, которые не считаются пробелами. Проблема с ними в том, что вы не можете их C&P, так как с их нулевой шириной нечего выбирать. Итак, я скопировал один, который близок к одному из них, пространство для волос (U+200A), которое находится прямо перед пробелом нулевой ширины (U + 200B) в Notepad ++, открыл его плагин Hex-Editor, нашел его битовое представление E2 80 8Aи изменил его на E2 80 8B. Успех! У меня был непробельный символ, который не виден в моем \nпеременная окружения.

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

echo Hi!
echo[
echo Hello!

Решения Кена и Джеба работают хорошо.

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

Для этого в конце сценария я преобразовал 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:

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


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

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

Почему бы не использовать подстроку / заменить пробел на echo;?

set "_line=hello world"
echo\%_line: =&echo;%
  • Полученные результаты:
hello
world
  • Или замените \n на echo;
set "_line=hello\nworld"
echo\%_line:\n=&echo;%

Это сработало для меня, нет необходимости в отложенном расширении:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Это пишет вывод как это:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

Для окон 10 с последовательностями виртуальных терминалов существуют средства управления положением курсора в высокой степени.

Чтобы определить escape-последовательность 0x1b, можно использовать следующее:

      @Echo off
 For /f %%a in ('echo prompt $E^| cmd')Do set \E=%%a

Чтобы вывести одну новую строку между строками:

      <nul set /p "=Hello%\E%[EWorld"

Чтобы вывести символы новой строки, где n заменяется целым числом:

      <nul set /p "=%\E%[nE"

Многие

Обратите внимание, что все решения, использующие позиционирование курсора в соответствии с последовательностями виртуального терминала консоли, позиционирование курсора с помощью:

работать только до тех пор, пока не достигнута нижняя часть окна консоли .

Внизу не осталось места для перемещения курсора вниз, поэтому он просто перемещается влево (с CRиз CRLF), а напечатанная ранее строка перезаписывается с ее начала.

просто

      set nl=.
echo hello
echo%nl%
REM without space ^^^
echo World

Результат:

      hello
world

14 лет спустя я рекомендую вместо этого использовать Powershell.

Вы даже можете, скорее всего, просто изменить файл, заканчивающийся на.batк.ps1и заставить его работать.

Затем вы можете использовать

      echo "Hello`nWorld"

# or even

echo Hello`nWorld

Проверено на Win10.

Вы также можете использовать новую строку типа Windows с помощьюecho "Hello`r`nWorld".

Источник: https://devblogs.microsoft.com/scripting/powertip-new-lines-with-powershell/, там написано: «Используйте символ n».


Большая путаница в других ответах и ​​комментариях произошла из-заechoдоступен в Windows и Linux. Для Linux вы можете просто использоватьecho "Hello\nWorld"чтобы получить тот же результат в большинстве дистрибутивов.

Но все же рекомендуется использоватьprintfв сценариях Linux.

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

type nul | more /e /p

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

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

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

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

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

Вы можете использоватьprintfвместоecho:

      printf "hello\nworld"

Выход:

      hello
world

Чтобы записать это в файл, я нашел единственный хороший вариант. К сожалению, у меня были трудности с получением этого в if (на случай, если у вас тоже возникнут проблемы, я, конечно, использовалsetlocal EnableDelayedExpansion)

      set text=hello\nworld
set "text=%text:\n= & echo %"
(echo %text%) > file.txt
cat file.txt

Добавление варианта ответа Кена, который показывает значения параметров для переменных среды с новыми строками в них.

Мы используем этот метод, чтобы добавить условия ошибки к строке в VAR, а затем в конце всей проверки ошибок вывести в файл сводку всех ошибок.

Это не полный код, просто пример.

      @echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: the two blank lines are required!
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
:: Example Usage:

Set ErrMsg=Start Reporting:
:: some logic here finds an error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title1!NL!Description!NL!Summary!NL!

:: some logic here finds another error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title2!NL!Description!NL!Summary!NL!

:: some logic here finds another error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title3!NL!Description!NL!Summary!NL!

echo %ErrMsg%
pause
echo %ErrMsg% > MyLogFile.log

Вывод журнала и экрана выглядит так...

Имейте в виду, что это не будет работать в консоли, потому что это будет имитировать клавишу выхода и очистить строку.

Используя этот код, замените <ESC>с escape-символом 0x1b или используйте эту ссылку Pastebin :

      :: Replace <ESC> with the 0x1b escape character or copy from this Pastebin:
:: https://pastebin.com/xLWKTQZQ

echo Hello<ESC>[Eworld!

:: OR

set "\n=<ESC>[E"
echo Hello%\n%world!

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

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

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

echo -e "hello\nworld"

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

Другие вопросы по тегам