В трюке используется поведение каретки.
Также объяснено на Длинные команды разбиты на несколько строк в пакетном файле (.bat) Windows Vista
Каретка - это выходсимвол для следующего символа, или в конце строки он используется как многострочный символ, но это почти то же самое.
В конце строки он просто экранирует следующий символ, в данном случае <Linefeed>
, но есть скрытая возможность, поэтому, если экранированный символ - <LF>
, он игнорируется, а следующий символ -читать и бежать, но этот символ всегда будет избегаться, даже если это также <LF>
.
Теперь вы можете понять
set NLM=^
rem Two empty lines are required here
Переменная NLM содержит ровно один символ <LF>
.Но если вы попытаетесь использовать его с echo Line1%NLM%Line2
, это не удастся, так как синтаксический анализатор прекратит синтаксический анализ на одном <LF>
.
Но это работает
echo Line1^
Line2
Так что вам нужно добавить экранированный перевод строки влиния и это NL-переменная.Переменная NL состоит только из трех символов.
NL=^<LF><LF>
И если она развернута, она создает только один экранированный <LF>
в качестве первого <LF>
после каретки, которая будет игнорироваться.
Кстати.На мой взгляд, гораздо проще использовать перевод строки с отложенным расширением, поскольку не нужно ничего экранировать.
В этом примере я использую %=EMPTY=%
вместо пустой строки (для самокомментирования), но в качестве переменной=EMPTY=
не может существовать, оно будет расширено до пустой строки.
setlocal EnableDelayedExpansion
(set NLM=^
%=EMPTY=%
)
echo Line1!NLM!Line2
РЕДАКТИРОВАТЬ: Добавить несколько советов для полезного использования <LF>
1) Использовать его как символ новой строки в echo
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
echo Line1!LF!Line2
2) Используйте его для разделения команд в блоке скобок
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
(
echo Line1%LF%set x=4%LF%echo !x!%LF%
)
3) Создайте (почти) пустой EOL-символ в цикле FOR / F, так как <LF>
является разделителем строки иEOL <LF>
совпадает с пустым.
FOR /F ^"eol^=^
delims^=^" %%a in (myFile.php) do echo %%a
4) Используйте LF для разделения текста в цикле FOR / F
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
set "var=Content1;Content2"
FOR /F "delims=" %%a in ("%var:;=!LF!%") do (
echo %%a
)