batch-file - 解释 Windows 批处理换行变量 hack 的工作原理

标签 batch-file

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

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

来自 How can you echo a newline in batch files?

最佳答案

该技巧使用插入符的行为。
也解释于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/

相关文章:

batch-file - 简单的批处理文件,如果 number = this echo hello,否则 echo world

command-line - 有什么方法可以自动将命令历史记录保存到cmd.exe中的文件中,类似于bash的bash_history?

windows - 找不到要通过 git bash 删除的文件,但它显示在文件资源管理器中

java - 从 bat 脚本运行的 Java 应用程序上的 Windows 关闭 Hook

batch-file - 批量将每行拆分为多行

windows - 为什么 Cygwin 可以运行 .bat 脚本?

batch-file - 批量退出时停止背景音频以及如何定界循环

windows - DOS/批处理文件出错时退出 for 循环

windows - 重命名文件名中包含空格和点的文件

Windows 批处理脚本从 FTP 下载 N 个最新文件并将它们提供给 EXE 文件