我看到三种可能的解决方法。
1) 构建包含多个for参数的行。
@echo off
SETLOCAL EnableDelayedExpansion
set "line="
for %%a in ("line1"
"line2"
"line3"
"line4"
) do set line=!line!%%~a
echo !line!
缺点:如果文本中有问号(?
)或星号(*
),则会丢失这些行。
2) 在每行末尾保留引号
@echo on
SETLOCAL EnableDelayedExpansion
set "line=line1 & x#"^
"line2 & a#"^
"line3 & b #"^
"line4 & c "
set "line=!line:#" "=!"
echo !line!
每行的第一个空格很重要,因为插入符号(caret)可以作为多行字符,但也会转义第一个字符,所以引号也会被转义。
所以在构建字符串后,我会替换掉不必要的 #" "。
编辑添加:3)引号消失
setlocal EnableDelayedExpansion
echo "A very long line I want to !="!^
split into two lines"
在我看来,这是最好的方法,因为解析器首先看到引号,所以最后的关 caret 就会生效,因为它似乎在引号之外。
但是这个!="!"
表达式将扩展名为= "
的变量,但是这样的变量名称无法存在(等号不能作为第一个字符出现),因此它会扩展为空。
您还可以创建安全表达式,它们始终会跳出引号,独立于该行中是否有引号。
!=" ^"!
echo This multiline works !="^"!^
as expected
echo "This multiline works !="^"!^
too"
如果你想避免延迟扩展,你也可以使用-FOR-Loop,例如:
for %%^" in ("") do (
echo "This multiline works %%~"^
too"
)
*?
这样的字符上失败了,因为for循环试图将它们用作通配符。但是你可以切换到FOR /F循环。 - jeb