2011-01-10 29 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 ^^^
& ^| ^> ^< ^" 
相關問題