说明如何批处理新行variables黑客工作

有人可以解释这是如何工作的?

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

从如何在batch file中回显换行符?

这个技巧使用插入符的行为。
在Long命令中也解释了在Vista / DOS批处理(.bat)文件中的多行分割

脱字符是下一个字符的转义字符,或者在行尾用作多行字符,但是这几乎是相同的。

在行末,它只是转义下一个字符,在这种情况下是<Linefeed> ,但是有一个隐藏的特性,所以如果转义字符是<LF>它将被忽略,下一个字符被读取和转义,但是这个即使它也是一个<LF> ,字符将永远逃脱。

现在你可以理解了

 set NLM=^ rem Two empty lines are required here 

NLMvariables只包含一个<LF>字符但是,如果您尝试使用echo Line1%NLM%Line2它会失败,因为parsing器停止parsing一个<LF>
但是这个工作

 echo Line1^ Line2 

所以你需要把一个转义的换行添加到行中,那就是NLvariables。 NLvariables只包含三个字符。
NL=^<LF><LF>如果这是展开的,创build只有一个转义后的<LF>作为第一个<LF>将被忽略。

顺便说一句。 在我看来,使用延迟扩展的换行要容易得多,因为没有必要逃脱任何东西。

 setlocal EnableDelayedExpansion set NLM=^ echo Line1!NLM!Line2 

编辑:附加一些提示有用的使用<LF>

1)在echo中用它作为换行符

 setlocal EnableDelayedExpansion set LF=^ echo Line1!LF!Line2 

2)用它来分割括号中的命令

 setlocal EnableDelayedExpansion set LF=^ ( echo Line1%LF%set x=4%LF%echo !x!%LF% ) 

3)在FOR / F循环中创build一个(几乎)空的EOL-chararcter,因为<LF><LF>的一个EOL的行分隔符与空行相同。

 FOR /F ^"eol^=^ delims^=^" %%a in (myFile.php) do echo %%a 

4)使用LF在FOR / F循环中分割文本

 setlocal EnableDelayedExpansion set LF=^ rem ** Two empty lines required set "var=Content1;Content2" FOR /F "delims=" %%a in ("%var:;=!LF!%") do ( echo %%a ) 

似乎有一种方式 ,也可以使用pipe道:

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