通过Windows批处理文件在多行中拆分长命令


Answers:


917

^只要您记得插入符和其后的换行符已完全删除,就可以用插入符断开长行。因此,如果您在换行的地方应该有一个空格,请加上一个空格。下面有更多内容。

例:

copy file1.txt file2.txt

将被写为:

copy file1.txt^
 file2.txt

95
如果^在命令文本之前和之后添加空格,则可以在下一行开始而不添加空格。
约瑟夫·戴格尔,

4
@SebaIllingworth-不,您可以随时添加[SPACE] + [^]和两个空行,以在echo编辑时创建总共2个换行符。
詹姆斯K

12
为了安全起见,使用
插入符号

4
@GavinMiller:“复制和新行上的file1.txt后的插入符号^无效”,这是不正确的。您可以在任意位置分割线,包括在单词中间co^␍py ^␍file1 ^␍file2。我建议您删除您的评论以避免混淆,特别是因为这个问题是如此受欢迎
Borodin

3
这里的一个陷阱是^必须是该行的最后一个字符,即后面不能有空格。我对此有麻烦,结果是在插入符号后有很多空格-在我使用的编辑器中不容易看到。
GregHNZ

266

插入符号的规则是:

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

您可以多次使用插入符号,但完整的行不能超过〜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

空行对于成功至关重要。这仅适用于延迟扩展,否则在换行后将忽略其余行。

之所以有效,是因为行尾的插入号会忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段也总是忽略回车)。


换行示例的最终代码块不显示空白行,即使它在那里。(至少它不会在IE7中显示)尝试改为使用blockquote重新格式化。
dbenham

5
问题是,我们应该支持一个不遵循规则的不良工具(有人称其为浏览器,但不是),还是应该切换到浏览器?
2011年

1
我用双引号将我的值引起来,如set var =“ text here ^”,但它不起作用。删除双引号就可以了。
rjt

1
@jeb,写下了一个失败的cmd脚本示例,但随后发现了以下问题: stackoverflow.com/questions/4643376/…–
rjt

如果下一行以引号开头,则此功能不起作用:copy ^[newline]"file1.txt" ^[newline]"file2.txt"不起作用!我必须添加一个空格:copy ^[newline] "file1.txt" ^[newline] "file2.txt"
亚历山大·盖布赫

69

(这基本上是对Wayne答案的重写,但是消除了插入符号周围的混乱。因此,我将其发布为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

(最后一个有效是因为the xc和the 之间没有空格^,并且在下一行的开头也没有空格。因此,当您删除the ^和newline时,会得到...。xcopy

为了提高可读性和完整性,最好只在两个参数之间打断(一定要包括空格)。

可以肯定的^不会在批处理文件中的最后一件事,因为似乎与一个重大问题


18

可以将多个命令放在括号中并分布在多行中。所以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 ^

1
该行cmd1.bat && cmd2.bat与parens形式不同:执行成功执行的cmd2.batiff cmd1.bat(-无设置%errorcode%)。后一种形式无条件执行。出乎意料的是(至少对我而言),显然,您不能同时使用+的组合,即&&在换行符之前添加。
Paul Michalik

( echo <line break here> hello )结果为空行。
卡尔·莫里森

最好,最干净的答案!插入符是丑陋的和有问题的正则表达式
neoscribe

9

但是,似乎在for循环的值中间进行拆分不需要插入符号(并且实际上尝试使用一个符号将被视为语法错误)。例如,

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

请注意,在问候之后或再见之前甚至都不需要空间。


当然,这是for语法的一部分:“ for-set”中元素的分隔符是空格,逗号,分号,等号,TAB字符和换行符。
Aacini '16

但是如果dopart包含多个/嵌套的if-else语句怎么办?
Vicky Dev

然后,您可以简单地使用括号将类似%n的语句括在(hello bye)do(echo%n echo%n)中
Mohammed Safwat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.