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

StackOverflow https://stackoverflow.com/questions/132799

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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.

Есть стандартная функция 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"

Сначала создается один символ перевода строки и присваивается переменной .
Это работает, поскольку курсор в конце строки пытается экранировать следующий символ, но если это перевод строки, он игнорируется, а следующий символ читается и экранируется (даже если это также перевод строки).
Затем вам понадобится третий перевод строки, чтобы завершить текущую инструкцию, иначе третья строка будет добавлена ​​к переменной LF.
Даже в пакетных файлах строки заканчиваются на CR/LF, важны только LF, поскольку на этом этапе синтаксического анализатора символы CR удаляются.

Преимущество использования отложенного расширения заключается в том, что вообще не требуется обработка специальных символов.
echo Line1%LF%Line2 потерпит неудачу, поскольку анализатор прекращает анализ при одиночном переводе строки.

Дополнительные пояснения находятся на
ТАК: длинные команды разделены на несколько строк в пакетном файле Vista/DOS (.bat).
ТАК: Как интерпретатор команд 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% всякий раз, когда вам нужна новая строка в операторе echo.Это ближе к твоему \n используется в различных языках.

Авария

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

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

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

echo. Продолжает оператор echo.

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

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

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

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

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)

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

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

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

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

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

Пример:

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

Если нужно использовать знаменитый в строковых литералах, которые можно передать в переменную, можно написать код, подобный приведенному в Привет.бат сценарий ниже:

@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 чтобы включить восклицательные знаки, которые расширяют переменные при выполнении.И исполнение заменяет \п с новая линия содержимое (синтаксис см. набор помощи).Мы могли бы, конечно, использовать !новая линия! при установке отвечать но \п это удобнее.Он может быть передан извне (попробуйте Привет R2 D2), где никто не знает имени переменной, содержащей разрыв строки (Да, Привет, C3!новая строка!P0 работает так же).

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

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


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

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

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

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

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

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

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

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

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

echo -e "hello\nworld"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top