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