如何将长命令拆分到批处理文件中的多行?
当前回答
多个命令可以放在括号中,并分布在许多行中;所以像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 ^
其他回答
插入符号的规则是:
行尾的插入符号,附加下一行,附加行的第一个字符将被转义。
可以多次使用插入符号,但整行不能超过最大行长度~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
空行对成功很重要。这只适用于延迟展开,否则换行后忽略其余的行。
它可以工作,因为行尾的插入符号忽略下一个换行并转义下一个字符,即使下一个字符也是换行(在此阶段总是忽略回车)。
你可以用插入符号^分隔长行,只要你记得插入符号和它后面的换行符是完全被删除的。所以,如果你要在断线处留出一个空格,也要留出一个空格。(详情见下文。)
例子:
copy file1.txt file2.txt
可以写成:
copy file1.txt^
file2.txt
多个命令可以放在括号中,并分布在许多行中;所以像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 ^
虽然carret将是更好的方法,但这里有另一种使用宏的方法,通过传递的参数来构造命令:
@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
%}}%
命令在没有插入符号的情况下更容易阅读,但使用特殊符号(如括号、重定向等)会破坏它。你可以在更简单的情况下这样做。尽管您仍然可以将参数括在双引号中
然而,在for循环的值中间进行分隔似乎不需要插入符号(实际上尝试使用插入符号会被认为是语法错误)。例如,
for %n in (hello
bye) do echo %n
注意,甚至在hello之后或bye之前都不需要空格。
推荐文章
- 如何从批处理文件运行PowerShell脚本
- 如何自动提升批处理文件,以便在需要时请求UAC管理员权限?
- 批处理文件:查找子字符串是否在字符串中(不是在文件中)
- “npm config set registry https://registry.npmjs.org/”在Windows bat文件中不工作
- 如何从批处理文件创建空文本文件?
- Windows批处理:无新行回显
- 在批处理文件中测试参数是否为空的正确方法是什么?
- 批处理文件,将文件从一个文件夹复制到另一个文件夹
- 在Windows系统上快速创建大文件
- 如何使用windows批处理文件循环文本文件中的每一行?
- 如何用批处理脚本对目录中的每个文件做一些事情
- 如何在Windows命令行中使用不同的颜色进行回显
- 如何检查进程是否通过批处理脚本运行
- 在windows的命令行上创建一个空文件(如linux的touch命令)
- DOS批处理中的逻辑操作符("and", "or")