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 循环中调用多个命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 批处理文件中循环?

从 for 循环中的多个连续异步调用中调用多个“setState”挂钩

for循环中的多个do命令:将字符串回显到文件然后重定向到命令窗口

如何在 Windows 批处理文件中循环?

Windows Bat 之For 循环

Windows bat脚本之for循环用法