解释Windows批处理的换行变量hack如何工作

14 浏览
0 Comments

解释Windows批处理的换行变量hack如何工作

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

@echo off

REM 创建一个换行变量(两个空行是必需的!)

set NLM=^

set NL=^^^%NLM%%NLM%^%NLM%%NLM%

REM 示例用法:

echo 这里应该插入一个换行%NL%。

输出:

这里应该插入一个换行

来自如何在批处理文件中输出换行符?

0
0 Comments

在Windows批处理中,有一种方法可以通过管道符号实现换行操作。例如,使用以下代码可以在批处理中实现换行操作:

(echo 1st line^

&echo 2nd line) | sort

然而,这种方法也会对每一行进行排序操作。因此,这个技巧并不适用于连接多行文件。

问题的出现原因是在Windows批处理中,通常无法直接使用换行符来表示换行,而是需要使用特殊字符来代替。这导致了在批处理中进行多行操作变得困难。

为了解决这个问题,人们发现了一种使用管道符号的技巧。通过在每一行的末尾添加^符号,可以将多行内容连接在一起。然后,使用管道符号将连接后的内容传递给其他命令进行处理。

尽管这种方法可以实现换行操作,但是它并不适用于连接多行文件。如果要连接多行文件,可以考虑使用其他方法,如使用文本编辑器或编程语言来处理。

0
0 Comments

问题:解释Windows批处理换行符变量的原理是如何工作的?

在Windows批处理中,使用^符号来作为转义字符,^符号后面的字符将被转义。在行尾,^符号可以用作多行字符。^符号后面的字符被转义,如果转义字符是(换行符),则会被忽略,而下一个字符将被读取并转义。通过这种方式,可以创建一个包含一个字符的变量。

然而,如果尝试使用这个变量来输出换行符,例如echo Line1%NLM%Line2,会失败,因为解析器在遇到单个字符时会停止解析。为了解决这个问题,需要在行中添加一个转义的换行符,即NL变量。NL变量由三个字符组成:NL=^。当该变量被扩展时,将创建一个转义的字符,因为第一个字符将被忽略。

此外,也可以使用延迟扩展的方式来使用换行符,不需要进行转义。以下是一个示例:

setlocal EnableDelayedExpansion

(set NLM=^

%=EMPTY=%

)

echo Line1!NLM!Line2

在这个示例中,使用%=EMPTY=%代替空行(用于自我注释),由于变量=EMPTY=不存在,它将被扩展为空行。

除了以上方法,还可以在批处理中使用字符的其他方式:

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)在FOR /F循环中创建(几乎)空的EOL字符:

FOR /F "eol=^

delims=" %%a in (myFile.php) do echo %%a

4)在FOR /F循环中分割文本:

setlocal EnableDelayedExpansion

(set LF=^

%=EMPTY=%

)

set "var=Content1;Content2"

FOR /F "delims=" %%a in ("%var:;=!LF!%") do (

echo %%a

)

以上就是关于Windows批处理换行符变量的原理以及解决方法的完整介绍。

0