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

684 batch-file

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

Way*_*yne 851

您可将长线,插入符号^,只要你记住,插入符和它后面的换行符被完全去除.所以,如果你应该有一个空间,你要打破线,包括一个空格.(更多关于以下内容.)

例:

copy file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

将写成:

copy file1.txt^
 file2.txt
Run Code Online (Sandbox Code Playgroud)

  • 如果在`^`之前和命令文本之后添加空格,则可以在没有空格的情况下启动下一行. (90认同)
  • 为安全**_ always_以空白线**结束使用插入符号时,请参阅[批处理文件中的简单克拉消耗所有内存](http://stackoverflow.com/questions/15466298) (10认同)
  • @GavinMiller:*"复制后的插入符号^和新行上的file1.txt将无效"*这不是真的.你可以在任何地方分割线,包括在一个单词的中间,比如`co ​​^␍py^␍file1^␍file2`.我建议你删除你的评论,以避免混淆,特别是因为这个问题很受欢迎 (3认同)
  • 似乎仅限于前两个附加线? (2认同)
  • @SebaIllingworth - 不,您可以随时添加[SPACE] + [^]和两个空白行,以便在"echo"时创建总共2个换行符. (2认同)
  • 这里的一个陷阱是^必须是该行的最后一个字符,即后面不能有空格。我对此有麻烦,结果是在插入符号后有很多空格-在我使用的编辑器中不容易看到。 (2认同)

jeb*_*jeb 251

插入符号的规则是:

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

您可以多次使用插入符号,但完整的行不得超过〜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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 问题是,我们应该支持一个不遵守规则的坏工具(有人称之为浏览器,但事实并非如此),还是应该切换到浏览器? (5认同)
  • 我的值周围有双引号,如 set var="text here ^ " 但它不起作用。把双引号去掉就可以了。 (2认同)

T.J*_*der 65

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

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

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

xcopy file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

可以写成:

xcopy^
 file1.txt^
 file2.txt
Run Code Online (Sandbox Code Playgroud)

要么

xcopy ^
file1.txt ^
file2.txt
Run Code Online (Sandbox Code Playgroud)

甚至

xc^
opy ^
file1.txt ^
file2.txt
Run Code Online (Sandbox Code Playgroud)

(这最后的作品,因为没有空间悫的xc^,并没有空格下一行的开始.所以,当你删除^和,你得到的换行... xcopy.)

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

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


Tod*_*dge 16

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

( echo hi
  echo hello )
Run Code Online (Sandbox Code Playgroud)

变量也可以帮助:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...
Run Code Online (Sandbox Code Playgroud)

另外我注意到carets(^)if条件只有在存在空格时才喜欢它们:

if exist ^
Run Code Online (Sandbox Code Playgroud)


小智 11

在搜索“如何分割长 DOS 批处理文件行”时,我没有找到的一件事是如何分割包含长引用文本的内容。事实上,上面的答案已经涵盖了它,但并不明显。使用插入符号来逃脱它们。例如

myprog "needs this to be quoted"
Run Code Online (Sandbox Code Playgroud)

可以写成:

myprog ^"needs this ^
to be quoted^"
Run Code Online (Sandbox Code Playgroud)

但要小心在以插入符号结束一行后以插入符号开始一行 - 因为它将作为插入符号出现..?:

echo ^"^
needs this ^
to be quoted^
^"
Run Code Online (Sandbox Code Playgroud)

->“需要引用此内容^”


Moh*_*wat 9

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

for %n in (hello
bye) do echo %n
Run Code Online (Sandbox Code Playgroud)

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


npo*_*aka 8

尽管插入符是更好的方法,但这里还有另一种方法,使用宏通过传递的参数构造命令:

@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
%}}%
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是黑魔法或牙买加巫术的样子。 (5认同)