我有几个包含文件的子目录,我想列出每个子目录,并在旁边列出该子目录中的文件数量(*.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 /R
和call :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