2011-01-10 27 views
23

如在Long commands split over multiple lines in Windows Vista batch (.bat) file中所述,使用^可以将Windows批处理文件中的长命令分割为多行。如何在Windows批处理文件中将双引号行分成多行?

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

echo "A very long line I want to^
split into two lines" 

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

有没有办法来解决这个问题?

回答

18

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

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 %%^" in ("") do (
echo "This multiline works %%~"^ 
too" 
) 
+0

答案并不简单,但这些都是一些很酷的技巧!我希望我可以有多个upvotes。谢谢! – 2011-01-10 14:45:23

+0

我真的很喜欢方法#1。这种方法有什么问题吗? – djangofan 2012-09-14 00:18:30

7

最直接的答案是逃避引号。它们将被打印,但就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 ^^^
& ^| ^> ^< ^" 
相关问题