Объясните, как работает пакетный взлом новой строки в Windows - PullRequest
64 голосов
/ 17 июня 2011

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

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

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

Ответы [ 2 ]

86 голосов
/ 17 июня 2011

В трюке используется поведение каретки.
Также объяснено на Длинные команды разбиты на несколько строк в пакетном файле (.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
)
5 голосов
/ 01 апреля 2013

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

(echo 1st line^
&echo 2nd line) | sort
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...