说明如何批处理新行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