如何在批处理文件中的多行上拆分长命令?
只要您记住插入符号及其后面的换行符被完全删除,您就可以使用插入符^分隔长行。因此,如果应该有一个空间,你要打破线,包括一个空格。 (更多关于以下内容。)
例:
1
| copy file1.txt file2.txt |
将写成:
1 2
| copy file1.txt^
file2.txt |
插入符号的规则是:
在行尾的插入符号附加下一行,附加行的第一个字符将被转义。
您可以多次使用插入符号,但完整的行不得超过?8192个字符的最大行长度(WindowsXP,WindowsVista和Windows7)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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 |
要禁止转义下一个字符,可以使用重定向。
重定向必须在插入符号之前。
但是在插入符号之前存在一种重定向的好奇心。
如果您在插入符号处放置令牌,则会删除令牌。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two
echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two |
并且还可以将换行符嵌入到字符串中:
1 2 3 4 5 6 7 8 9 10
| 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 |
空行对成功至关重要。这仅适用于延迟扩展,否则换行后将忽略该行的其余部分。
它有效,因为行末端的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段始终忽略回车符)。
(这基本上是对Wayne答案的重写,但是由于对插入符号的混淆被清除了。所以我把它作为CW发布。我并不羞于编辑答案,但完全重写它们似乎不合适。)
您可以使用插入符号(^)分隔长行,只需记住插入符号及其后面的换行符将完全从命令中删除,因此如果将其放在需要空格的位置(例如参数之间) ,一定要包括空格(在^之前,或者在下一行的开头,后一个选择可能有助于使其更清晰,这是一个延续)。
示例:(所有在Windows XP和Windows 7上测试过)
1
| xcopy file1.txt file2.txt |
可以写成:
1 2 3
| xcopy^
file1.txt^
file2.txt |
要么
1 2 3
| xcopy ^
file1.txt ^
file2.txt |
甚至
1 2 3 4
| xc^
opy ^
file1.txt ^
file2.txt |
(最后一步是因为xc和^之间没有空格,而下一行的开头没有空格。所以当你删除^和换行符时,你得到...... )。
为了便于阅读和理智,最好只在参数之间进行分解(确保包含空格)。
确保^不是批处理文件中的最后一件事,因为它似乎存在一个主要问题。
多个命令可以放在括号中并分布在多个行中;所以像echo hi && echo hello这样的东西可以像这样:
变量也可以帮助:
1 2 3 4 5
| set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
start"" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
... |
另外我注意到插入符号(^),只有存在空格时,if条件符号才会使它们跟随:
然而,似乎在for循环的值的中间分割不需要插入符号(实际上尝试使用一个将被视为语法错误)。例如,
1 2
| for %n in (hello
bye) do echo %n |
请注意,在hello之后或再见之前甚至不需要空格。