Windows 批处理:在 FOR 循环中调用多个命令?
Posted
技术标签:
【中文标题】Windows 批处理:在 FOR 循环中调用多个命令?【英文标题】:Windows batch: call more than one command in a FOR loop? 【发布时间】:2011-01-16 05:10:01 【问题描述】:Windows 批处理文件是否可以在单个 FOR
循环中调用多个命令?例如,我想打印文件名并在删除后:
@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.
我知道在这种情况下,我可以通过执行两个不同的 FOR 循环来解决它:一个用于显示名称,一个用于删除文件,但是否可以仅在一个循环中完成?
【问题讨论】:
【参考方案1】:使用&
可以用于短命令,但是单行可以很快变得很长。发生这种情况时,请切换到多行语法。
FOR /r %%X IN (*.txt) DO (
ECHO %%X
DEL %%X
)
(
和 )
的位置很重要。 DO
后面的圆括号必须放在同一行,否则批处理文件会出错。
详情请见if /?|find /V ""
。
【讨论】:
这个解决方案看起来干净易读。我还要警告任何使用此解决方案的程序员,不得将DO
之后的圆括号放在下一行,否则它会破坏批处理文件。在我编写 for 循环的代码中,我通常将大括号
放在下一行。
另外——如果你的任何嵌套命令中有括号(例如,像“echo Something something (something else)”之类的东西,请小心编辑:啊,请参阅 bk1e 的答案 :)
关键是:DO后面的圆括号一定要放在同一行,否则批处理文件会出错!【参考方案2】:
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
【讨论】:
其实我觉得括号是不必要的。for %i in (1 2 3) do echo %i & echo foo
打印出我所期望的:“1”、“foo”、“2”、“foo”、“3”、“foo”(在单独的行上)。
不应该是&&
而不是&
吗?
@jww &&
如果第一个命令失败,将失败,&
将执行第二个命令。
如果此解决方案对您产生语法错误,请检查您是否在 DO
-parens 之间有未转义的括号。您可以通过向它们附加 ^
来逃避它们。【参考方案3】:
SilverSkin 和 Anders 都是正确的。您可以使用括号来执行多个命令。但是,您必须确保命令本身(及其参数)不包含括号。 cmd
贪婪地搜索第一个右括号,而不是优雅地处理嵌套的括号集。这可能会导致命令行的其余部分无法解析,或者可能会导致某些括号被传递给命令(例如DEL myfile.txt)
)。
解决方法是将循环体拆分为单独的函数。请注意,您可能需要跳过函数体以避免“掉入”它。
FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF
:loopbody
ECHO %1
DEL %1
GOTO :EOF
【讨论】:
当我们讨论这个话题时,%X 在处理文件名时永远不会正确,总是使用 "%~X" (在你这里的例子中,你可能会在子函数中使用 %* ) 这是一个非常好的观点。C:\Program Files (x86)
是演示这两个问题的一个很好的路径示例。以上是关于Windows 批处理:在 FOR 循环中调用多个命令?的主要内容,如果未能解决你的问题,请参考以下文章
从 for 循环中的多个连续异步调用中调用多个“setState”挂钩