在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
请注意,在拜访之后或再见之前,甚至不需要空间。