我试图计算目录中的目录数量。我不确定我的代码有什么问题:
@echo off
setlocal disabledelayedexpansion
set "folder=%~1"
if not defined folder set "folder=%cd%"
SET /a counter=0
for /D %%a in ("%folder%\*") do (
echo folder %counter%: %%~nxa
SET /a counter=%counter%+1
)
endlocal
正在打印
folder 0: folder1
folder 0: folder2
...
所以我认为计数器每次循环都会重置为0,但我不确定原因。
答案 0 :(得分:1)
由于您正在编写和在同一代码块(即counter
循环)中读取变量for
,因此您需要建立delayed expansion;否则你总是在执行块之前得到的值
@echo off
setlocal EnableDelayedExpansion
set "folder=%~1"
if not defined folder set "folder=%cd%"
set /A counter=0
for /D %%a in ("%folder%\*") do (
echo folder !counter!: %%~nxa
SET /a counter=!counter!+1
)
endlocal
无论如何,set /A
不需要显式变量扩展,您可以简单地编写set /A counter=counter+1
,甚至更简单,set /A counter+=1
,因此您不需要延迟扩展。但是,为了在循环中回显值!counter!
,您仍然需要延迟扩展。
有一种更简单的方法来计算文件夹数量,使用dir /B /A:D
将普通文件夹列表piped by |
返回到find /C
以保证接收到的行数:
dir /B /A:D "%folder%\*" | find /C /V ""
您可以使用for /F
loop捕获结果并将其存储在变量中:
for /F %%a in ('
dir /B /A:D "%folder%\*" ^| find /C /V ""
') do (
set "counter=%%a"
)
请注意此处所需的转义管道^|
。
答案 1 :(得分:0)
如果可以使用PowerShell:
PS C:\Users\pwatson> Get-ChildItem -Directory | Measure-Object | Select-Object -Property Count
Count
-----
44