通过Windows批处理文件在多行中拆分长命令

Split long commands in multiple lines through Windows batch file

如何在批处理文件中的多行上拆分长命令?


只要您记住插入符号及其后面的换行符被完全删除,您就可以使用插入符^分隔长行。因此,如果应该有一个空间,你要打破线,包括一个空格。 (更多关于以下内容。)

例:

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
( 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条件符号才会使它们跟随:

1
if exist ^


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

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

请注意,在hello之后或再见之前甚至不需要空格。