使用FOR计数文件(命令批处理)

时间:2017-01-18 10:25:37

标签: batch-file for-loop

我想只计算Windows批处理目录中的文件。 (如果我有任何文件,最终目的是调用vbs文件。)

这是我到目前为止所拥有的:

set /a db=0
echo %db%

for /f %%i in ('dir /b') do (
    set /a db=%db%+1
    echo %db%
)

echo %db%

这将给出以下内容:0 0 0 0 1表示%db%的值 (因为我目前在目录中有3个文件)

也许是微不足道的,但是为什么它不会在循环期间增加%db%的值,只是到最后?

for的最后一个循环(%db%仍然是0)和最后一行(%db%已经是1)之间会发生什么?

我该如何解决?

提前致谢!

2 个答案:

答案 0 :(得分:2)

在执行批处理文件时,首先解析每行或每行(括号中的行),然后执行。在解析阶段,将删除变量读取操作(您检索变量的值,即%var%),并替换为变量内的值。完成此操作后,将执行生成的命令。

for循环中,您正在更改db变量,但无法检索更改的值。在for命令开始执行之前,所有读取操作都替换为变量中的值。

解决此问题的常用方法是启用延迟扩展,并在需要时将%var%语法更改为!var!语法。这告诉批处理解析器必须延迟变量/值替换,直到执行命令,而不是在解析行/块时。

setlocal enabledelayedexpansion
set /a db=0
echo %db%

for /f %%i in ('dir /b') do (
    set /a db=!db!+1
    echo !db!
)

echo %db%

现在for循环内的读取操作正在使用延迟扩展。

但是,你甚至不需要它。 set /a使用自己的解析器,它能够检索引用变量中的值,因此您可以使用任何这些选项

set /a db=db+1
set /a db+=1

更改变量而不必使用read语法。

此外,除非您需要考虑隐藏文件,否则最好不要使用for /f处理在单独的dir实例中执行的cmd命令的输出。只需使用for循环

set /a "db=0"
for %%a in (*) do set /a "db+=1"
echo %db%

但是,如果你指出所有你需要的是知道你是否有任何文件,而不是它们的数量,所有这些甚至都不需要

dir /a-d >nul 2>nul && ( echo there are files ) || ( echo there is not any file )

它只执行dir命令,排除文件夹(/a-d),丢弃任何输出(>nul)或错误消息(2>nul)。   - 如果找到任何文件(无错误),则执行条件运算符&&之后的命令。   - 如果没有任何文件,则dir命令失败,执行||条件运算符后的命令。

答案 1 :(得分:1)

如果您只想检测是否有任何文件,MC ND已经在their answer中显示了可靠的方式。

要计算文件数量,您可以让find command完成工作,因为它具有一个/C开关,用于计算匹配行数。如果您指定通过/V执行反向搜索(以便返回所有不匹配的行)以及空搜索字符串"",则返回所有行。 因此,当find的输入来自列出所有文件的dir命令行时,将返回文件总数(2> nul会在没有文件的情况下禁止显示错误消息):

2> nul dir /B /A:-D | find /C /V ""

要捕获变量中的计数,请使用for /F loop

for /F %%C in ('
    2^> nul dir /B /A:-D ^| find /C /V ""
') do set "COUNT=%%C"
echo %COUNT%

请注意,>|之类的特殊字符需要在^之前进行转义,以便不会立即处理它们,而是在cmd实例中启动for /F