有人可以解释一下这是如何工作的吗?
@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.
最佳答案
该技巧使用插入符的行为。
也解释于Long commands split over multiple lines in Windows Vista batch (.bat) file
插入符号是下一个字符的转义字符,或者在行尾用作多行字符,但这几乎是相同的。
在行尾,它只是转义下一个字符,在本例中为 <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=%
而不是空行(用于 self 注释),而是作为变量 =EMPTY=
不能存在它将扩展为空行。
setlocal EnableDelayedExpansion
(set NLM=^
%=EMPTY=%
)
echo Line1!NLM!Line2
编辑:附加一些使用 <LF>
有用的提示。
1) 将其用作 echo
中的换行符
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
echo Line1!LF!Line2
2) 用它来分割括号 block 中的命令
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
(
echo Line1%LF%set x=4%LF%echo !x!%LF%
)
3) 在 FOR/F 循环中创建一个(几乎)空的 EOL 字符,
如<LF>
行分隔符 EOL 为 <LF>
与空的一样。
FOR /F ^"eol^=^
delims^=^" %%a in (myFile.php) do echo %%a
4) 在 FOR/F 循环中使用 LF 分割文本
setlocal EnableDelayedExpansion
(set LF=^
%=EMPTY=%
)
set "var=Content1;Content2"
FOR /F "delims=" %%a in ("%var:;=!LF!%") do (
echo %%a
)
关于batch-file - 解释 Windows 批处理换行变量 hack 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379619/