【问题标题】:Using Set /A in forfiles.exe in batch file在批处理文件中使用 forfiles.exe 中的 Set /A
【发布时间】:2013-05-29 21:19:03
【问题描述】:

这是最奇怪的事情。我不知道 forfiles 是异步的还是什么的,但是这段代码对我来说似乎很简单明了,并且不起作用:

set a=0
forfiles /S /C "cmd /c if @isdir==FALSE set /a a+=1 & echo !a!"

我想的一个简单的计数器。但是,输出的是: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

最后a 仍然设置为0。

我已启用延迟扩展。为什么这不起作用?

【问题讨论】:

    标签: loops batch-file cmd


    【解决方案1】:

    看来,forfiles 为每个文件调用一个新的 cmd 并具有新的“新鲜和空”环境。来自101 是由set 命令创建的,如您在此示例中所见:

    forfiles /S /C "cmd /v:on /c if @isdir==FALSE set/a a+=1 >nul&echo !a!"
    0
    0
    0
    ...
    

    要让它工作,最好使用for 循环:

    for /r %%i in (*) do set /a a+=1 &echo !a!
    

    【讨论】:

    • forfiles /s 递归到子文件夹中,因此等效的 for 循环需要 /r
    • for /f %%i in ('dir /b /s /a:-D') do set /a a+=1 & echo !a! 将递归执行。
    • 那很好。我知道我可以用for /r 做到这一点,但我无法理解为什么其他方法不起作用。虽然我可以通过echoing 1 让它反复工作到一个文本文件中并计算行数。但主要是我不明白为什么它不起作用。回想起来,你的答案似乎很明显......但事后看来..blah..blah。无论如何,感谢您的明确回答。
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多