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)
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)
空行对成功至关重要.这仅适用于延迟扩展,否则换行后将忽略该行的其余部分.
它有效,因为行末端的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段始终忽略回车符).
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)
->“需要引用此内容^”
然而,似乎在for循环的值的中间分割不需要插入符号(实际上尝试使用一个将被视为语法错误).例如,
for %n in (hello
bye) do echo %n
Run Code Online (Sandbox Code Playgroud)
请注意,在hello之后或再见之前甚至不需要空格.
尽管插入符是更好的方法,但这里还有另一种方法,使用宏通过传递的参数构造命令:
@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)
如果没有插入符号,命令更容易阅读,但使用特殊符号(例如括号、重定向等)会破坏它。所以你可以用这个来处理更简单的情况。尽管您仍然可以将参数括在双引号中