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


当前回答

插入符号的规则是:

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

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

空行对成功很重要。这只适用于延迟展开,否则换行后忽略其余的行。

它可以工作,因为行尾的插入符号忽略下一个换行并转义下一个字符,即使下一个字符也是换行(在此阶段总是忽略回车)。

其他回答

你可以用插入符号^分隔长行,只要你记得插入符号和它后面的换行符是完全被删除的。所以,如果你要在断线处留出一个空格,也要留出一个空格。(详情见下文。)

例子:

copy file1.txt file2.txt

可以写成:

copy file1.txt^
 file2.txt

在搜索“如何拆分一个长DOS批处理文件行”时,我没有找到的一件事是如何拆分包含长引号文本的内容。 事实上,上面的答案中包含了这一点,但并不明显。使用插入符号来转义它们。 如。

myprog "needs this to be quoted"

可以写成:

myprog ^"needs this ^
to be quoted^"

但要注意,在用插入符结束一行后,再用插入符开始一行-因为它会变成插入符..?:

echo ^"^
needs this ^
to be quoted^
^"

-> "需要加引号^"

插入符号的规则是:

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

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

空行对成功很重要。这只适用于延迟展开,否则换行后忽略其余的行。

它可以工作,因为行尾的插入符号忽略下一个换行并转义下一个字符,即使下一个字符也是换行(在此阶段总是忽略回车)。

多个命令可以放在括号中,并分布在许多行中;所以像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之前都不需要空格。