如何在Windows批处理文件中将双引号行拆分为多行?

Wan*_*wei 26 batch-file

Windows批处理文件中的长命令可以通过使用在Windows Vista批处理(.bat)文件中拆分多行的Long命令中^提到的方式拆分为多行.

但是,如果插入符号位于双引号字符串中,则不起作用.例如:

echo "A very long line I want to ^
split into two lines"
Run Code Online (Sandbox Code Playgroud)

这将打印"A very long line I want to ^并告诉我split是一个未知的命令.

有办法解决这个问题吗?

jeb*_*jeb 24

我看到三种可能的解决方法.

1)构建组合多个参数的线.

@echo off
SETLOCAL EnableDelayedExpansion

set "line="
for %%a in ("line1" 
"line2"
"line3"
"line4"
) do set line=!line!%%~a
echo !line!
Run Code Online (Sandbox Code Playgroud)

2)在每行末尾留下"引用"

@echo on
SETLOCAL EnableDelayedExpansion

set "line=line1 & x#"^
 "line2 & a#"^
 "line3 & b #"^
 "line4 & c "

set "line=!line:#" "=!"
echo !line!
Run Code Online (Sandbox Code Playgroud)

每行中的第一个空格很重要,因为插入符号用作多行字符但它也会转义第一个字符,因此引用也会被转义.
所以我在构建线之后替换了不合情理的#"".

编辑补充:3)消失的报价

setlocal EnableDelayedExpansion
echo "A very long line I want to !"=!^
split into two lines"
Run Code Online (Sandbox Code Playgroud)

在我看来,这是最好的方式,它的工作原理是解析器首先看到引号,因此最后的插入符号将起作用,因为它似乎在引号之外.
但是这个!"=!表达式会扩展名为的变量"=,但是这样的变量名不能存在(等号只能作为第一个字符出现),所以它扩展为空.

您还可以创建安全表达式,如果行中有引号,它们将始终脱离引号,独立.
!"^"=!

echo This multiline works !"^"=!^
as expected
echo "This multiline works !"^"=!^
too"
Run Code Online (Sandbox Code Playgroud)

如果你想避免延迟扩展,你也可以使用-FOR-Loop之类的

for %%^" in ("") do (
echo "This multiline works %%~"^
too"
)
Run Code Online (Sandbox Code Playgroud)


dbe*_*ham 9

最直接的答案是逃避报价.它们将被打印,但就CMD.EXE而言,它们不会在功能上引用内容.

@echo off
echo ^"A very long line I want to ^
split into two lines^"
Run Code Online (Sandbox Code Playgroud)

行中出现的任何特殊字符也必须进行转义,因为它们不再在功能上引用.

@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^& ^| ^> ^< ^"
Run Code Online (Sandbox Code Playgroud)

正如杰布所说,线路延续逃脱了下一条线的第一个角色.因此,如果下一行的第一个字符恰好是一个特殊字符,则不应该第二次转义.下面的代码将给出与前一个示例完全相同的结果.

@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^
& ^| ^> ^< ^"
Run Code Online (Sandbox Code Playgroud)