2017-06-02 84 views
0

我在计算目录中的目录数。我不知道什么是错我的代码:计算目录数

@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,但我不确定为什么。

+1

你写了'set \了',而不是'SET/A'。 – Ryan

+0

我修正了这个问题,但得到了同样的结果。该计数器保持为0. – greenthumbtack

+3

请使用顶栏上的搜索功能 – Magoo

回答

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到cound收到的行数:

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" 
) 

注意逃脱管这里需要。

0

如果可以使用PowerShell的:

PS C:\Users\pwatson> Get-ChildItem -Directory | Measure-Object | Select-Object -Property Count 

Count 
----- 
    44