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

Windows批处理:在FOR循环中调用多个命令?,windows,batch-file,cmd,Windows,Batch File,Cmd,在Windows批处理文件中,是否可以在单个FOR循环中调用多个命令?例如,我想打印文件名,然后删除: @ECHO OFF FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X) REM the line above is invalid syntax. 我知道在这种情况下,我可以通过执行两个不同的FOR循环来解决这个问题:一个用于显示名称,另一个用于删除文件,但是否可以只在一个循环中执行?使用&可以很短的命令,但这一行可以很快变长。发生这种情况时,请切换到多行

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

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

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

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

FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)
的位置很重要。
DO
后面的圆括号必须放在同一行,否则批处理文件将不正确


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

SilverSkin和Anders都是正确的。可以使用括号执行多个命令。但是,您必须确保命令本身(及其参数)不包含括号
cmd
贪婪地搜索第一个右括号,而不是优雅地处理嵌套的括号集。这可能会导致命令行的其余部分无法解析,或者可能会导致一些括号传递给命令(例如,
DEL myfile.txt)

解决方法是将循环体拆分为单独的函数。请注意,您可能需要在函数体周围跳跃,以避免“跌入”函数体


事实上,我认为括号是不必要的<(1 2 3)do echo%i和echo foo中的%i的代码>打印我期望的内容:“1”、“foo”、“2”、“foo”、“3”、“foo”(在单独的行上)。这不应该是
&
而不是
&
?@jww
&
吗?如果第一个命令失败,&将失败,
&
将执行第二个命令。如果此解决方案为您造成语法错误,请检查
DO
-paren之间是否有未替换的paren。您可以通过在它们后面附加一个
^
来逃避它们。虽然我们在讨论这个主题,但在处理文件名时,%X永远都是不正确的,请始终使用“%~X”(在您的示例中,您可以在子函数中使用%*),这是一个非常好的观点。演示这两个问题的路径的一个很好的例子是
C:\ProgramFiles(x86)
。此解决方案看起来干净易读。我还要警告任何使用此解决方案的程序员,
DO
后面的圆括号不能放在下一行,否则它会阻止批处理文件。在代码中,当我编写for循环时,我通常会将花括号放在下一行。{此外--如果任何嵌套命令中有括号,请小心(例如,类似“echo something(something other)”的内容编辑:啊,请参阅bk1e的答案:)关键是:DO后的圆括号必须放在同一行,否则批处理文件将不正确!
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