Объясните, как работает пакет обновления Windows newline new

Может кто-нибудь объяснить, как это работает?

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

испускает:

There should be a newline
inserted here.

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

Ответ 1

Трюк использует поведение каретки.
Также объяснено, что Long команды разделены на несколько строк в пакетном (.bat) файле Windows Vista

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

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

Теперь вы можете понять

set NLM=^


rem Two empty lines are required here

NLM-Variable содержит ровно один символ <LF>. Но если вы попытаетесь использовать его с echo Line1%NLM%Line2 он не сработает, так как синтаксический анализатор прекратит синтаксический анализ на одном <LF>.
Но это работает

echo Line1^

Line2

Таким образом, вам нужно добавить escape-строку в строку, и это NL-Variable. NL-Variable состоит только из трех символов.
NL=^<LF><LF> И если он расширен, он создает только один экранированный <LF> как первый <LF> после того, как карет будет проигнорирован.

Btw. На мой взгляд, гораздо проще использовать линейные переводы с задержкой расширения, так как нет необходимости ничего скрывать.
В этом примере я использую %=EMPTY=% вместо пустой строки (для самостоятельного комментирования), но поскольку переменная =EMPTY= не может существовать, она будет расширена до пустой строки.

setlocal EnableDelayedExpansion
(set NLM=^
%=EMPTY=%
)
echo Line1!NLM!Line2

EDIT: добавьте полезные советы, используя <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-chararcter в цикле 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
)

Ответ 2

Кажется, способ, который также работает с pipe:

(echo 1st line^
&echo 2nd line) | sort