在Windows Vista批处理(.bat)文件中,长命令分成多行

如何在Windows(Vista)batch file中使长命令遍历多行?

只要你记住脱字符和跟在它后面的换行符都被完全删除了,你可以用脱字符分行。 所以,如果应该有一个空间,你打破了路线,包括一个空间。 ( 更多关于下面。 )

例:

 copy file1.txt file2.txt 

会写成:

 copy file1.txt^ file2.txt 

脱字的规则是:

在行尾有一个插入符,追加下一行,附加行的第一个字符将被转义。
您可以多次使用该插入符号,但完整的行不得超过〜8192个字符(XP / Vista / Win7)的最大行长度。

 echo Test1 echo one ^ two ^ three ^ four^ * --- Output --- Test1 one two three four* echo Test2 echo one & echo two --- Output --- Test2 one two echo Test3 echo one & ^ echo two --- Output --- Test3 one two echo Test4 echo one ^ & echo two --- Output --- Test4 one & echo two 

要抑制下一个字符的转义,可以使用redirect。
redirect必须在插入符号之前。 但是在插入符号之前还有一个好奇的redirect。 如果您在插入符号处放置一个标记,则会删除标记。

 echo Test5 echo one <nul ^ & echo two --- Output --- Test5 one two echo Test6 echo one <nul ThisTokenIsLost^ & echo two --- Output --- Test6 one two 

也可以将换行符embedded到string中

 setlocal EnableDelayedExpansion set text=This creates ^ a line feed echo Test7: %text% echo Test8: !text! --- Output --- Test7: This creates Test8: This creates a line feed 

空行对于成功很重要。
这只适用于延迟扩展,否则在换行后忽略该行的其余部分。

它的工作原理是因为行尾的插入符号忽略下一个换行符,并且转义下一个字符,即使下一个字符也是换行符(回车在这个阶段总是被忽略)。

(这基本上是韦恩的答案的重写,但是对于脱字符的困惑,所以我把它作为CW发布了,我并不害怕编辑答案,但是完全重写它们似乎是不合适的。

你可以用插入符号( ^ )分隔很长的一行,只要记住脱字符和跟在它后面的换行符完全从命令中删除 ,所以如果你把它放在需要空格的地方(比如参数之间),一定要包括这个空间(在^之前,或者在下一行的开始 – 后面的select可能有助于使它更清晰,这是一个延续)。

例子:( 所有在Windows XP和Windows 7上testing过)

 xcopy file1.txt file2.txt 

可以写成:

 xcopy^ file1.txt^ file2.txt 

要么

 xcopy ^ file1.txt ^ file2.txt 

甚至

 xc^ opy ^ file1.txt ^ file2.txt 

(最后一个作品是因为xc^没有空格,所以在下一行的开头没有空格,所以当你删除^和newline时,你会得到… xcopy 。)

为了便于阅读和理智,最好在参数之间打破(确保包含空格)。

确保^ 不是batch file中的最后一个东西,因为这似乎是一个主要问题 。

多个命令可以放在括号中,并分散在多行中; 所以像echo hi && echo hello可以像这样放置:

 ( echo hi echo hello ) 

variables也可以帮助:

 set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE" if exist %AFILEPATH% ( start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING... ) else ( ... 

我还注意到,用逗号( ^ ), if条件是喜欢他们跟随只有一个空间是存在的:

 if exist ^ 

但似乎在for循环的值中间分割并不需要插入符号(实际上试图使用它将被视为语法错误)。 例如,

 for %n in (hello bye) do echo %n 

请注意,在拜访之后或再见之前,甚至不需要空间。