题
如何在批处理文件中将长命令拆分为多行?
解决方案
您可以使用插入符号分隔长行 ^
只要您记住插入符号及其后面的换行符已被完全删除即可。因此,如果需要在换行处插入一个空格,请添加一个空格。 (下面详细介绍一下。)
例子:
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 之前甚至不需要空格。