我想只计算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)之间会发生什么?
我该如何解决?
提前致谢!
答案 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
。