2017-01-18 31 views
0

我只需要对Windows批处理目录中的文件进行计数。 (最终目的是调用一个VBS文件,如果我有任何的文件任何责任。)使用FOR计算文件(命令批处理)

这是我到目前为止有:

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

在执行批处理文件时,首先分析每行或每行块(括号中的行),然后执行。在分析阶段,变量读取操作(在您检索变量的值的位置,即%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 

改变变量,而无需使用阅读语法。

此外,除非需要考虑隐藏文件,否则最好不要使用for /f处理在单独的cmd实例中执行的dir命令的输出。只需使用一个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

如果你只是想检测是否有任何文件,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% 

注意,像>|特殊字符需要通过^前为了逃脱他们不被处理immediat但是在由for /F发起的cmd实例中。