it-swarm.cn

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

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

634
Dan

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

例:

copy file1.txt file2.txt

将写成:

copy file1.txt^
 file2.txt
795
Wayne

插入符号的规则是:

在行尾的插入符号附加下一行,附加行的第一个字符将被转义。

您可以多次使用插入符号,但完整的行不得超过〜8192个字符的最大行长度(Windows XP,Windows Vista和Windows 7)。

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

要禁止转义下一个字符,可以使用重定向。

重定向必须在插入符号之前。但是在插入符号之前存在一种重定向的好奇心。

如果您在插入符号处放置令牌,则会删除令牌。

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


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

并且还可以 将换行符 嵌入到字符串中:

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

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

它有效,因为行末端的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段始终忽略回车符)。

239
jeb

(这基本上是对 Wayne的回答 的重写,但是随着插入符号的混乱而被清除。所以我把它作为CW发布。我并不羞于编辑答案,但是 完全重写它们 似乎不合适。)

您可以使用插入符号分隔长行(^),只需记住插入符号及其后面的换行符完全删除,如果您将其放在需要空格的位置(例如在参数之间),一定要包括空格(在^之前,或在下一行的开头 - 后一个选择可能有助于使它更清晰,它是一个延续)。

示例:(所有在Windows XP和Windows 7上测试)

xcopy file1.txt file2.txt

可以写成:

xcopy^
 file1.txt^
 file2.txt

要么

xcopy ^
file1.txt ^
file2.txt

甚至

xc^
opy ^
file1.txt ^
file2.txt

(最后一步是因为xc^之间没有空格,并且下一行的开头没有空格。所以当你删除^和换行符时,你会得到...xcopy。)

为了便于阅读和理智,最好只在参数之间进行分解(确保包含空格)。

确保^ not 批处理文件中的最后一件事,因为 似乎是 的主要问题。

59
T.J. Crowder

多个命令可以放在括号中并分布在多个行中;所以像echo hi && echo hello这样的东西可以这样放:

( echo hi
  echo hello )

变量也可以帮助:

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

另外我注意到了carets(^if条件因素只有在存在空格时才会遵循它们:

if exist ^
13
Todd Partridge

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

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

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

8
Mohammed Safwat