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

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

Split long commands in multiple lines through Windows batch file

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


只要您记住插入符号及其后面的换行符被完全删除,您就可以使用插入符^分隔长行。因此,如果应该有一个空间,你要打破线,包括一个空格。 (更多关于以下内容。)

例:

1
copy file1.txt file2.txt

将写成:

1
2
copy file1.txt^
 file2.txt

插入符号的规则是:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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

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

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

如果您在插入符号处放置令牌,则会删除令牌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

并且还可以将换行符嵌入到字符串中:

1
2
3
4
5
6
7
8
9
10
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

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

它有效,因为行末端的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段始终忽略回车符)。


(这基本上是对Wayne答案的重写,但是由于对插入符号的混淆被清除了。所以我把它作为CW发布。我并不羞于编辑答案,但完全重写它们似乎不合适。)

您可以使用插入符号(^)分隔长行,只需记住插入符号及其后面的换行符将完全从命令中删除,因此如果将其放在需要空格的位置(例如参数之间) ,一定要包括空格(在^之前,或者在下一行的开头,后一个选择可能有助于使其更清晰,这是一个延续)。

示例:(所有在Windows XP和Windows 7上测试过)

1
xcopy file1.txt file2.txt

可以写成:

1
2
3
xcopy^
 file1.txt^
 file2.txt

要么

1
2
3
xcopy ^
file1.txt ^
file2.txt

甚至

1
2
3
4
xc^
opy ^
file1.txt ^
file2.txt

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

为了便于阅读和理智,最好只在参数之间进行分解(确保包含空格)。

确保^不是批处理文件中的最后一件事,因为它似乎存在一个主要问题。


多个命令可以放在括号中并分布在多个行中;所以像echo hi && echo hello这样的东西可以像这样:

1
2
( echo hi
  echo hello )

变量也可以帮助:

1
2
3
4
5
set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start"" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

另外我注意到插入符号(^),只有存在空格时,if条件符号才会使它们跟随:

1
if exist ^

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

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

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


推荐阅读

    linux监控cpu命令?

    linux监控cpu命令?,情况,系统,信息,状态,时间,实时,电脑,工具,命令,百分比,li

    linux密码更改命令?

    linux密码更改命令?,密码,系统,名称,信息,环境,命令,使用者,用户,权限,终端,L

    linux硬盘挂载命令?

    linux硬盘挂载命令?,系统,设备,信息,电脑,情况,状态,管理,数据,工具,命令,lin

    linux命令替换的字符?

    linux命令替换的字符?,命令,数据,系统,商业,字符串,文件,内容,方法,批量,字

    linux命令行大全如何?

    linux命令行大全如何?,地址,命令,基础,工作,管理,单位,数据,标准,目录,文件,l

    linux开启bnc命令?

    linux开启bnc命令?,网络,工作,酒店,电脑,光线,信息,位置,网卡,中心,价格,寝室

    图形化linux命令集?

    图形化linux命令集?,系统,工作,密码,信息,软件,地址,命令,状态,工具,电脑,lin

    linux命令行打开浏览?

    linux命令行打开浏览?,系统,网络,网址,工具,密码,首页,服务,网站,数据,地址,l

    linux使用ssh命令?

    linux使用ssh命令?,服务,系统,软件,在线,认证,地址,命令,协议,虚拟机,主机,ss

    linux系统查版本命令?

    linux系统查版本命令?,系统,信息,名称,状态,设备,命令,软件,工具,版本,终端,l

    linux的安装软件命令?

    linux的安装软件命令?,软件,系统,名称,发行,官方网站,市场,官网,密码,网站,

    linux开启命令行命令?

    linux开启命令行命令?,系统,单位,工具,电脑,首页,终端,情况,密码,权威,命令,l

    rmlinux命令详解?

    rmlinux命令详解?,系统,命令,名称,工作,文件,目录,文件夹,环境,档案,不了,Lin

    linux操作命令重命名?

    linux操作命令重命名?,图片,软件,名称,名字,文件,命令,状态,代码,工具,系统,L

    linux快速写入命令?

    linux快速写入命令?,地址,命令,生产,资料,数据,单位,文件,文本,控制台,字符

    强大系统linux命令?

    强大系统linux命令?,系统,工作,地址,信息,命令,管理,名称,位置,目录,控制台,l

    linux怎么返回命令?

    linux怎么返回命令?,暂停,电脑,系统,一致,状态,密码,地址,服务,命令,空格,在L

    linux命令自动填充?

    linux命令自动填充?,培训,企业,教育,实战,基础,技术,项目,服务,环境,发展,哪

    linux日历的命令是?

    linux日历的命令是?,系统,时间,工作,情况,命令,管理,信息,大陆,国家,电脑,基

    linux中用到的命令?

    linux中用到的命令?,工作,系统,地址,信息,管理,命令,目录,网络,数据,单位,lin