我想要一个批处理文件来计算子目录中的文件。并将此计数保存到文本文件中。
这里概述了我真正想要的东西:
一个文件夹包含多个文件夹,因此我需要将所有子文件夹文件计数到文本文件。
O / p将是:
folder1:23
folder2:34
folder3:12
我认为你明白我的观点。请帮帮我。
答案 0 :(得分:4)
这是一种略有不同的方法。
以下脚本遍历指定目录的子目录,为每个子目录调用DIR /A-D
,并从DIR
输出的摘要中提取文件计数,以显示它与名称一起显示子目录。
@ECHO OFF
SET "rootpath=%~1"
FOR /D %%D IN ("%rootpath%\*") DO (
FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
ECHO %%D: %%K
)
)
父目录的路径应该来自命令行。
该脚本仅计算位于子目录中的文件。但是,如果需要,可以轻松扩展它以返回存储在子目录树中的所有文件的计数。这是一种方式:
@ECHO OFF
SET "rootpath=%~1"
FOR /D %%D IN ("%rootpath%\*") DO (
SET cnt=0
FOR /F %%K IN ('DIR /A-D /S "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
SET /A cnt+=%%K
)
SETLOCAL EnableDelayedExpansion
ECHO %%D: !cnt!
ENDLOCAL
)
修改后的版本与原版版本几乎相同,但DIR
的输出现在可能包含多个摘要。该脚本从每个摘要中提取文件计数,并将所有计数相加以获取目录树中的总文件数。在显示结果时,需要在这种情况下启用延迟扩展,因为总计数存储在环境变量(cnt
)中,并且在这种情况下使用“正常”(即时)无法正确评估环境变量)扩张。
另一个注意事项是,两个版本都显示包含显示子目录名称时的路径。如果您只想要名字(根据您对其他答案的评论,似乎要做),请使用ECHO %%~nxD: ...
代替ECHO %%D: ...
。
答案 1 :(得分:1)
修改强>
我已经重做了这件事。该示例使用两个批处理文件; test.cmd
和filecount.cmd
test.cmd
仅迭代目录,并为每个目录调用filecount.cmd
。
您只显式运行test.cmd
文件,该文件又调用filecount.cmd
来计算文件,并生成如下所示的输出,这是我刚才的短测试的实际输出。如果您不想要主目录中的文件计数,只需从第一个批处理文件中省略该行。
.: 7
folder1: 3
folder2: 2
folder3: 5
该示例假定批处理文件与您计算文件的目录位于同一目录中。
test.cmd:
@echo off
setlocal
call filecount .
for /f %%f in ( 'dir /AD /b' ) do (
call filecount %%f
)
:EOF
endlocal
filecount.cmd:
@echo off
setlocal enabledelayedexpansion
set /a i=0
for /f %%f in ( 'dir /b /A-D %1' ) do (
set /a i=i+1
@rem echo %%f !i!
)
echo %1: %i%
:EOF
endlocal
filecount.cmd
只是回显到屏幕,因此您可以根据需要将该输出重定向到文件。
这是一个粗略准备的示例,并且不能递归地抓取目录结构,但是您可以稍微修改它以实现它。正如我在原始(编辑前)答案中所说,在某些时候,批处理语言并没有给你足够的力量(可能),你需要查看类似vbscript或javascript的内容。