使用 cmd.exe 列出每个子目录及其中的文件数

使用 cmd.exe 列出每个子目录及其中的文件数

我有几个包含文件的子目录,我想列出每个子目录,并在旁边列出该子目录中的文件数量(*.html具体来说)。例如,我现在"C:\Users\user1\Desktop\temp"想要以下列表:

"C:\Users\user1\Desktop\temp\subdir1"  5 files
"C:\Users\user1\Desktop\temp\subdir2"  4 files
"C:\Users\user1\Desktop\temp\subdir2\subdir1"  7 files

我尝试使用此代码,但它只列出了当前目录中的文件数:

dir /b *.html /s 2> nul | find "" /v /c > tmp && set /p count=<tmp && del tmp && echo %count%

答案1

我强烈建议您学习 PowerShell - 作为一种语言,它比批处理语言更加完整和一致。以下是 PowerShell 中的解决方案

Get-ChildItem -recurse -directory | foreach {$c = ((Get-ChildItem $_ -File *.html| Measure-Object).Count); write-host $_ $c}

或较短的版本

gci -recurse -directory | foreach {$c = ((gci $_ -File *.html| Measure).Count); write-host $_ $c}

此命令获取目录列表,将它们foreach通过管道传输到该命令,每次迭代一个目录,并将名称放入 $_ 变量中。然后,我们列出每个目录中与模式匹配的文件,计算结果并将计数保存在$c变量中。最后,我们写入路径(仍在 中$_)和计数$c

答案2

这对我来说很有效(我刚刚写了它)。我结合了两种隔离调用的方法。您会注意到,我已将搜索目录与实际计数文件分开。

第一个块使用for /Rcall :label功能来搜索目录结构并将找到的目录传递给名为的函数:CountFilesInDir。CountFilesInDir 函数使用另一种方法允许在循环中使用变量并使用该EnableDelayedExpansion选项。

我这样做有两个原因。第一,我喜欢将代码分解为函数。:) .. 第二,我向你展示了在循环中获取变量集的两种方法。

最后,您会注意到第一个循环之前有一个变量,用于决定您要计算的文件类型TypeToCount

    @echo off

    SetLocal EnableDelayedExpansion
    Set TypeToCount=*.html
    for /R %%d in (.) do call :CountFilesInDir "%%d" "%TypeToCount%"
    EndLocal
    goto :EOF

    ::::::::::::::::::::::::::::::::::::::::::::::::::
    :CountFilesInDir
    ::::::::::::::::::::::::::::::::::::::::::::::::::
    SetLocal
    Set InputPath=%~1
    Set TypeToCount=%~2
    pushd %InputPath%

    Set FileCount=0
    for /F "delims=" %%f in ('dir /a-d /b %TypeToCount% 2^>nul') do (
      Set /a FileCount = !FileCount! + 1
    ) 

    echo "%InputPath:~0,-2%" %FileCount% files
    popd
    EndLocal
    goto :EOF

相关内容