如何在批处理文件中将长命令拆分为多行?
7 回答
^
只要您记住插入符号和它后面的换行符已完全删除,您就可以用插入符号分解长行。所以,如果应该有一个空格,你要打破线,包括一个空格。(更多内容如下。)
例子:
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 之前甚至不需要空格。
搜索“如何拆分长的 DOS 批处理文件行”时我没有找到的一件事是如何拆分包含长引用文本的内容。实际上,它已包含在上面的答案中,但并不明显。使用插入符号来逃避它们。例如
myprog "needs this to be quoted"
可以写成:
myprog ^"needs this ^
to be quoted^"
但要注意在用插入符号结束一行后用插入符号开始一行 - 因为它会以插入符号出现..?:
echo ^"^
needs this ^
to be quoted^
^"
->“需要引用这个^”
尽管 carret 将是执行此操作的更好方法,但这里还有一种使用宏的方法,该宏通过传递的参数构造命令:
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "{{=setlocal enableDelayedExpansion&for %%a in (" & set "}}="::end::" ) do if "%%~a" neq "::end::" (set command=!command! %%a) else (call !command! & endlocal)"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
%{{%
echo
"command"
written
on a
few lines
%}}%
没有插入符号的命令更容易阅读,但使用特殊符号(例如括号、重定向等)会破坏它。因此,您可以将其用于更简单的情况。尽管您仍然可以将参数括在双引号中