Windows批处理:在FOR循环中调用多个命令?


124

Windows批处理文件中是否可以在单个 FOR循环中调用多个命令?例如,假设我要打印文件名,然后将其删除:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

我知道在这种情况下,我可以通过执行两个不同的FOR循环来解决它:一个用于显示名称,一个用于删除文件,但是是否可以仅在一个循环中完成呢?

Answers:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
实际上,我认为括号是不必要的。for %i in (1 2 3) do echo %i & echo foo打印我期望的:“ 1”,“ foo”,“ 2”,“ foo”,“ 3”,“ foo”(在单独的行上)。
bk1e 2010年

&&不是&吗?
jww

9
&&如果第一个命令失败,@ jww 将失败,&无论如何将执行第二个命令。
yyny

如果此解决方案为您带来语法错误,请检查-parens之间是否有未转义的DOparen。您可以通过^在它们后面加上a 来逃避它们。
КонстантинВан

199

&对于简短的命令,可以使用,但是单行可以很快很长。发生这种情况时,请切换到多行语法。

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

安置()事项。之后的圆括号DO必须放在同一行上,否则批处理文件将不正确。

有关if /?|find /V ""详细信息,请参见。


12
该解决方案看起来干净且可读。我还要警告使用此解决方案的任何程序员,DO切勿将下划线后的圆括号放在下一行,否则会破坏批处理文件。在代码中,当我编写for循环时,通常将大括号放在{下一行。
Marco Demaio 2011年

2
另外-如果您的任何嵌套命令都带有方括号,请当心(例如,类似“ echo Something something(something something)”之类的编辑:啊,请参阅bk1e的回答:)
Tim Barrass

31

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

3
当我们讨论这个主题时,%X在处理文件名时永远不会正确,请始终使用“%〜X”(在您的示例中,您可能会在子函数中使用%*逃脱)
Anders 2010年

1
这是一个很好的观点。证明这两个问题的路径的一个很好的例子是C:\Program Files (x86)
bk1e 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.