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 |
(最后一步是因为
为了便于阅读和理智,最好只在参数之间进行分解(确保包含空格)。
确保
多个命令可以放在括号中并分布在多个行中;所以像
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 ( ... |
另外我注意到插入符号(
1 | if exist ^ |
然而,似乎在for循环的值的中间分割不需要插入符号(实际上尝试使用一个将被视为语法错误)。例如,
1 2 | for %n in (hello bye) do echo %n |
请注意,在hello之后或再见之前甚至不需要空格。