Batch file 通过Windows批处理文件将长命令拆分为多行

Batch file 通过Windows批处理文件将长命令拆分为多行,batch-file,Batch File,如何将长命令拆分为批处理文件中的多行?您可以使用插入符号拆分长行,只要您记住插入符号及其后的换行符已完全删除。所以,如果应该有一个空间,你打破了界限,包括一个空间。() 例如: copy file1.txt file2.txt 将写为: copy file1.txt^ file2.txt xcopy^ file1.txt^ file2.txt 插入符号的规则是: 行尾的插入符号追加下一行,追加行的第一个字符将被转义 您可以多次使用插入符号,但完整的行长度不得超过最大行长度约8192个

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

您可以使用插入符号拆分长行,只要您记住插入符号及其后的换行符已完全删除。所以,如果应该有一个空间,你打破了界限,包括一个空间。()

例如:

copy file1.txt file2.txt
将写为:

copy file1.txt^
 file2.txt
xcopy^
 file1.txt^
 file2.txt

插入符号的规则是:

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

您可以多次使用插入符号,但完整的行长度不得超过最大行长度约8192个字符(WindowsXP、WindowsVista和Windows7)

要禁止转义下一个字符,可以使用重定向

重定向必须正好在插入符号之前。 但在插入符号之前存在一种好奇心

如果在插入符号处放置标记,则该标记将被删除

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two
空行对成功很重要。这仅适用于延迟扩展,否则在换行后将忽略行的其余部分

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

(这基本上是对的重写,但围绕插入符号的混乱已经消除。因此我将其作为CW发布。我并不羞于编辑答案,但完全重写答案似乎不合适。)


您可以使用插入符号(
^
)分隔长行,但请记住,插入符号及其后面的换行符将完全从命令中删除,因此如果将其放在需要空格的位置(例如参数之间),请确保也包含空格(在
^
之前,或在下一行的开头-后一种选择可能有助于更清楚地表明这是一个延续)

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

可以写为:

copy file1.txt^
 file2.txt
xcopy^
 file1.txt^
 file2.txt

甚至

xc^
opy ^
file1.txt ^
file2.txt
(这最后起作用是因为
xc
^
之间没有空格,下一行的开头也没有空格。因此,当您删除
^
和换行符时,您会得到…
xcopy

为了可读性和合理性,最好只在参数之间断开(确保包含空格)


确保“<代码> ^ < /代码>是<强> > <>强>批处理文件中的最后一个,如

,但是似乎在for循环的值的中间不需要插入(实际上使用一个将被认为是语法错误)。例如,

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

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

可以将多个命令放在括号中,并分布在多行中;因此,类似于
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 ^

尽管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
%}}%

命令在没有插入符号的情况下更容易阅读,但使用特殊符号(如括号、重定向等)会破坏命令。因此,对于更简单的情况,您可以这样做。尽管您仍然可以将参数括在双引号中,但如果在
^
之前和命令文本之后添加空格,则可以不带空格地开始下一行。@SebaIllingworth-不,在
echo
ed时,您始终可以添加[SPACE]+[^]和两个空行,以创建总共两个换行符。为安全起见,在使用插入符号时始终以空行结尾,请参阅@GavinMiller:“复制后插入符号^这不是真的。你可以在任何地方分割线,包括在单词的中间,比如<代码>␍派克^␍文件1^␍file2。我建议您删除您的注释以避免混淆,尤其是因为此问题非常流行。这里的问题是,^必须是行中的最后一个字符-即后面没有空格。我遇到了问题,结果发现插入符号后面有一堆空格-在我使用的编辑器中不容易看到最后一个代码行的代码块不显示空白行,即使它在那里。(至少它没有出现在IE7中)尝试使用块引用来重新格式化。问题是,我们是否应该支持一个不符合规则的坏工具(有人把它称为浏览器,但它不是)。或者您应该切换到浏览器吗?我的值周围有双引号,如set var=“text here^”中所述,但它不起作用。删除双引号就可以了。@jeb,编写了一个失败的cmd脚本示例,但随后发现这个问题:如果下一行以引号开头:
copy^[newline]“file1.txt”,则该选项不起作用^[newline]“file2.txt”
不起作用!我必须添加一个空格:
copy^[newline]“file1.txt”^[newline]“file2.txt”
。当然,这是
for
语法的一部分:“for set”中元素的分隔符是空格、逗号、分号、等号、制表符和换行符。但是如果
do
part包含多个/嵌套的
if else
语句呢?那么您可以简单地使用括号将语句括起来,例如%n in(hello bye)do(echo%n echo%n)这是一种可能的方法,但首先需要将所有项目存储在一行中并执行一次。行
cmd1.bat&&cmd2.bat
与parens表单不同:execute
cmd2.bat
iff
cmd1.bat
执行成功(-未设置
%errorcode%
)。后一种形式无条件执行。有点出乎意料(至少对我来说)的是,显然,您不能使用combinat
if exist ^
@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
%}}%