如何将双引号行分成Windows批处理文件中的多行?
Windows批处理文件中的长命令可以通过使用^
分割为多行,如在Windows Vista批处理(.bat)文件中分割多行的长命令中所述。
但是,如果插入符号位于双引号字符串中,则不起作用。 例如:
echo "A very long line I want to ^
split into two lines"
这将打印出"A very long line I want to ^
并告诉我split
是一个未知的命令。
有没有办法解决这个问题?
我看到三种可能的解决方法。
1)构建组合多个for-parameters的生产线。
@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!
每行中的第一个空格很重要,因为该脱字符作为多行字符使用,但它也可以脱离第一个字符,因此也可以省去引号。
所以我在建立这条线之后替换了那些粗糙的#“”。
编辑添加:3)消失的引号
setlocal EnableDelayedExpansion
echo "A very long line I want to !"=!^
split into two lines"
在我看来,这是最好的方式,因为解析器首先看到引号,因此最后的插入符号将起作用,因为它看起来不在引号内。
但是这个!"=!
表达式将扩展名为"=
的变量,但是这样的变量名称不能存在(等号仅能作为第一个字符出现),因此它扩展为空。
您也可以创建安全的表达式,它们将始终用引号排除,如果行中有报价或者不存在,则可以独立。
!"^"=!
echo This multiline works !"^"=!^
as expected
echo "This multiline works !"^"=!^
too"
如果你想避免延迟扩展,你也可以使用-FOR-Loop
for %%^" in ("") do (
echo "This multiline works %%~"^
too"
)
最直接的答案是逃避报价。 它们将被打印,但就CMD.EXE而言,它们不会在功能上引用内容。
@echo off
echo ^"A very long line I want to ^
split into two lines^"
出现在该行中的任何特殊字符也必须被转义,因为它们不再被引用。
@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^& ^| ^> ^< ^"
正如jeb所说的那样,这条线延续了下一行的第一个字符。 所以如果下一行的第一个字符碰巧是一个特殊字符,它不应该第二次逃脱。 下面的代码将给出与前面的例子完全相同的结果。
@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^
& ^| ^> ^< ^"
今天我想出了自己的方法,我从来没有见过它建议任何地方,所以我想我会在这里发布它。 当然,在客观意义上它不够高雅。 我会说它有它自己独特的丑陋和一些局限性,但是与其他选择相比,我发现它更符合“人体工程学”。
具体而言,该方法具有无需转义任何东西的独特特性,同时仍然执行典型的变量替换。 这使我能够采取一些看起来完全如何我想要的字符串,将其分散到多行中,并为每行添加前缀而不更改字符串中的任何其他字符。 因此,找出特殊字符和转义字符如何相互作用是没有必要的尝试和错误。 总的来说,我认为它减少了确定性地在多行中产生复杂字符串变量所需的认知负载,这对我很有好处,因为我不想认真思考并因偶然的复杂性而感到沮丧,例如windows命令的细微差别翻译。 另外,在linux bash上也可以使用类似的技术,使其具有一定的便携性。
注意:我没有完全测试它,它可能不适用于某些用例,我不知道。 然而,这个例子有相当多的看起来很麻烦的角色,所以它看起来有点强大。
set IMAGE_NAME=android-arm64
set CMD=docker run --rm
set CMD=%CMD% --platform=linux
set CMD=%CMD% -v %CD%:/work
set CMD=%CMD% dockcross/%IMAGE_NAME%
set CMD=%CMD% /bin/sh -c
set CMD=%CMD% "mkdir build-%IMAGE_NAME% &&
set CMD=%CMD% cd build-%IMAGE_NAME% &&
set CMD=%CMD% cmake .. &&
set CMD=%CMD% cmake --build ."
echo %CMD%
在我的情况下,这是一个命令,所以我可以运行它:
%CMD%
我会接受任何关于此方法的反馈或建议。 也许它可以改进。
链接地址: http://www.djcxy.com/p/92291.html上一篇: How to split double quoted line into multiple lines in Windows batch file?
下一篇: Simple caret (^) at end of Windows batch file consumes all memory