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

有帮助吗?

解决方案

您可以使用插入符号分隔长行 ^ 只要您记住插入符号及其后面的换行符已被完全删除即可。因此,如果需要在换行处插入一个空格,请添加一个空格。 (下面详细介绍一下。)

例子:

copy file1.txt file2.txt

会写成:

copy file1.txt^
 file2.txt

其他提示

插入符号的规则是:

行尾的脱字号会附加下一行,附加行的第一个字符将被转义。

您可以多次使用插入符号,但整行不得超过最大行长度约 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

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

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

(这基本上是重写 韦恩的回答 但随着插入符号周围的混乱消失了。所以我把它作为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.)

为了可读性和完整性,最好只在参数之间进行中断(确保包含空格)。

确保 ^不是 批处理文件中的最后一件事,就像那里一样 这似乎是一个主要问题.

多个命令可以放在括号中并分布在多行中;所以像 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 (
...

我还注意到带有插入符(^)那 if 条件语句仅在存在空格时才遵循:

if exist ^

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top