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

Mar*_*aio 116 windows cmd batch-file

在Windows批处理文件中是否可以在单个 FOR循环中调用多个命令?比方说,我想打印文件名,删除后:

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

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

And*_*ers 190

使用&对于短命令来说很好,但是这一行可以非常快地完成.发生这种情况时,请切换到多行语法.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)
Run Code Online (Sandbox Code Playgroud)

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

详情if /?|find /V ""请见.

  • 此解决方案看起来干净可读.我还要警告任何使用此解决方案的程序员,"DO"之后的圆括号不得放在下一行,否则它会制动批处理文件.在编写for循环的代码中,我通常将大括号`{`下一行放置. (12认同)
  • 另外 - 如果你的任何嵌套命令都有括号,请小心(例如,像"回显某事(别的东西)"之类的东西)编辑:啊,看看bk1e的答案:) (2认同)

Sil*_*kin 109

FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
Run Code Online (Sandbox Code Playgroud)

  • 如果第一个命令失败,@ jww` &&`将失败,`&`将执行第二个命令. (9认同)
  • 实际上,我认为括号是不必要的。为(1 2 3)中的%i执行echo%i&echo foo`会打印出我期望的样子:“ 1”,“ foo”,“ 2”,“ foo”,“ 3”,“ foo”(在单独的行)。 (2认同)

bk1*_*k1e 30

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
Run Code Online (Sandbox Code Playgroud)

  • 当我们讨论这个主题时,%X在处理文件名时永远不会正确,总是使用"%~X"(在你的例子中,你可以在子函数中使用%*) (2认同)