通过使用Long commands split over multiple lines in Windows Vista batch (.bat) file中提到的^
,可以将Windows批处理文件中的长命令拆分为多行。
但是,如果插入符号在双引号字符串内,它将不起作用。例如:
echo "A very long line I want to ^
split into two lines"
这将打印"A very long line I want to ^
并告诉我split
是一个未知的命令。
有没有办法绕过这个问题?
发布于 2011-01-10 17:05:20
我认为有三种可能的解决方法。
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!
每行的第一个空格很重要,因为插入符号可以作为多行字符使用,但它也会转义第一个字符,因此引号也会转义。
因此,我在构建行之后替换了不必要的#“”。
EDIT新增: 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"
)
发布于 2012-04-13 02:11:15
最直接的答案是转义引号。它们将被打印出来,但就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 ^^ ^
& ^| ^> ^< ^"
发布于 2018-05-23 21:31:41
今天我想出了我自己的方法,我从来没有在任何地方看到过它的建议,所以我想我应该把它贴在这里。当然,从客观意义上讲,它并不优雅。我想说它有它自己独特的丑陋和一些局限性,但我发现它与其他替代品相比更符合人体工程学。
具体地说,该方法具有独特的特性,即不需要转义任何东西,同时仍然执行典型的变量替换。这使我能够获得一些看起来与我想要的完全相同的字符串,将其分布在多行中,并在不更改字符串中任何其他内容的情况下为每行添加前缀。因此,不需要反复试验来确定特殊字符和转义字符之间的交互方式。总体而言,我认为它减少了在多行代码中确定地产生复杂字符串变量所需的认知负荷,这对我来说是件好事,因为我不想费力思考,也不想为附带的复杂性而沮丧,比如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%
我对任何关于这种方法的反馈或建议都持开放态度。也许它甚至可以改进。
https://stackoverflow.com/questions/4643376
复制相似问题