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


当前回答

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

例子:

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^
^"

-> "需要加引号^"

虽然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
%}}%

命令在没有插入符号的情况下更容易阅读,但使用特殊符号(如括号、重定向等)会破坏它。你可以在更简单的情况下这样做。尽管您仍然可以将参数括在双引号中

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

(这基本上是韦恩的答案的重写,但清除了插入符号周围的混乱。所以我把它贴在了CW上。我并不羞于编辑答案,但完全重写它们似乎不太合适。)

你可以用插入符号(^)把长行分开,只是要记住,插入符号和它后面的换行符将从命令中完全删除,所以如果你把它放在需要空格的地方(比如参数之间),一定要包括空格(要么在^之前,要么在下一行的开头——后一种选择可能有助于让它更清楚地显示它是一个延续)。

机场当局注意:下一行的第一个字符已转义。因此,如果它带有任何特殊含义(如&或|),则该含义将丢失,它将被解释为纯文本字符(参见底部的最后一个示例)。

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

xcopy file1.txt file2.txt

可以写成:

xcopy^
 file1.txt^
 file2.txt

or

xcopy ^
file1.txt ^
file2.txt

甚至

xc^
opy ^
file1.txt ^
file2.txt

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

为了可读性和完整性,最好只在参数之间进行分隔(一定要包括空格)。

确保^不是批处理文件中的最后一个东西,因为这似乎有一个主要问题。

下面是一个在下一行开始转义字符的例子:

xcopy file1.txt file2.txt ^
& echo copied successfully

这将不起作用,因为&将被转义并失去其特殊含义,从而将所有“file1.txt file2.txt & echo copy successfully”作为参数发送到xcopy,导致错误(在本例中)。

为了避免这种情况,在下一行的开头添加一个空格。