Как вы можете вставить новую строку из вывода командного файла?
Я хочу сделать что-то вроде:
echo hello\nworld
Что бы вывести:
hello
world
echo Yes&echo No
Как вы можете вставить новую строку из вывода командного файла?
Я хочу сделать что-то вроде:
echo hello\nworld
Что бы вывести:
hello
world
echo Yes&echo No
Ответы:
echo hello & echo.world
Это означает, что вы можете определить & echo.
как константу для новой строки \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
echo(
для повышения производительности (но все же без места). Расширенное обсуждение других персонажей и их достоинств / недостатков в ECHO. Не в состоянии дать текст или пустую строку - Вместо этого используйте ECHO /
Использование:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
несколько эхо, это не сработает
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
а потом echo line 2 >> Makefile
. Использование >>
аргументов приводит к добавлению вывода в файл, что является именно тем поведением, которое необходимо для этого случая.
Вот, пожалуйста, создайте файл .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.
set nl=^&echo.
, тогда просто echo hello %nl% world
дает тот же эффект.
В echo:
cmd / bat-файлах есть стандартная функция записи пустой строки, которая эмулирует новую строку в вашем cmd-выходе:
@echo off
@echo line1
@echo:
@echo line2
Вывод приведенного выше cmd-файла:
line1
line2
echo(
. Похоже, это может вызвать проблемы, но на самом деле работает отлично. Все другие формы имеют по крайней мере одну ситуацию, когда команда не будет работать так, как нужно.
ECHO(
не получается.
echo
и каковы их эффекты?»
Как и ответ Кена, но с использованием отложенного расширения.
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:
следует избегать, так как они могут быть очень медленным, в зависимости от места , где скрипт будет выполняться, как сетевой диск.
call :pause line1!\n!line2
, начните подпрограмму с setlocal EnableDelayedExpansion
и завершите ее, setlocal DisableDelayedExpansion
чтобы предотвратить преждевременную интерпретацию новой строки.
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 для громкого крика), поэтому нет &&
необходимости.
echo.
Продолжает эхо-утверждение.
Все это работает, потому что вы можете создавать переменные, которые являются кодом, и использовать их внутри других команд. Это похоже на функцию гетто, так как пакетная обработка не является самой продвинутой из языков сценариев оболочки. Это работает только потому, что в пакете плохо используются переменные, а не различие между целыми числами, символами, числами с плавающей запятой, строками и т. Д., Естественно.
Если вы хитры, вы можете заставить это работать с другими вещами. Например, используя его для отображения вкладки
set t=^&echo. ::there are spaces up to the double colon
echo.
при первой попытке найти файл с таким именем. Используйте другие знаки препинания, такие какecho,
При отображении чего-либо для перенаправления в файл несколько команд echo не будут работать. Я думаю, что перенаправитель «>>» - хороший выбор:
эхо привет> темп эхо мира >> темп
(echo hello && echo world) > temp
упомянутый Натаном Дж. Брауэром в комментарии к (текущему) принятому ответу работ.
Точно так же, как предлагает Grimtron - вот быстрый пример, чтобы определить это:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
строку, между ними нет пробелов.
echo "Hello %newline% 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)
Если кто-нибудь приходит сюда, потому что он хочет повторить пустую строку из make-файла MINGW, я использовал
@cmd /c echo.
просто используя echo.
причины страшныеprocess_begin: CreateProcess(NULL, echo., ...) failed.
сообщение об ошибке.
Я надеюсь, что это поможет по крайней мере еще одному человеку там :)
Если нужно использовать известный \ 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 для того, чтобы восклицательные знаки , которые расширяют переменные по исполнению. И подменяет выполнение \ п с новой строкой содержимого (ищу синтаксис в справочном наборе ). Конечно, мы могли бы использовать ! 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 off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
Это пишет вывод как это:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
echo asdf >myfile.txt
даст те же результаты. echo
добавляет новую строку в конец строки.
Чтобы начать новую строку в пакете, все, что вам нужно сделать, это добавить "echo [", вот так:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
тоже плохое решение.
echo.
. Ожидать, что пользователи вашего скрипта будут удалять файлы в своей системе только потому, что вашему скрипту нужна новая строка, для меня это не очень хороший дизайн.
Решения Кена и Джеба работают хорошо.
Но новые строки генерируются только с символом LF, и мне нужны символы CRLF (версия для Windows).
Для этого в конце сценария я преобразовал LF в CRLF.
Пример:
TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
Вы можете использовать @echo
(@echo + [пробел] + [незащищенный пробел])
Примечание: незащищенное пространство можно получить с помощью Alt + 0160
Надеюсь, поможет :)
[править] Хм, вы правы, мне нужно было это в Makefile, там он отлично работает. Я думаю, мой ответ не адаптирован для пакетных файлов ... Мой плохой.
ECHO ist eingeschaltet (ON).
не пустую строку, попробовал в cmd-приглашение