Batch file 需要批处理文件来计算子目录中的文件数

Batch file 需要批处理文件来计算子目录中的文件数,batch-file,Batch File,我想要一个批处理文件来计算子目录中的文件。并将此计数保存到文本文件 以下是我想要的东西: 一个文件夹包含多个文件夹,因此我需要将所有子文件夹的文件数计入文本文件 O/p将为: folder1:23 folder2:34 folder3:12 我想你明白我的意思了。请帮助我。编辑 我已经重新做过了。该示例使用两个批处理文件test.cmd和filecount.cmd test.cmd仅迭代目录,并为每个目录调用filecount.cmd 您只需显式运行test.cmd文件,该文件依次调用filec

我想要一个批处理文件来计算子目录中的文件。并将此计数保存到文本文件

以下是我想要的东西:

一个文件夹包含多个文件夹,因此我需要将所有子文件夹的文件数计入文本文件

O/p将为:

folder1:23

folder2:34

folder3:12

我想你明白我的意思了。请帮助我。

编辑

我已经重新做过了。该示例使用两个批处理文件
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的内容。

edit

我已经重新做过了。该示例使用两个批处理文件
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的内容。

这里有一个稍微不同的方法

下面的脚本迭代指定目录的子目录,为每个子目录调用
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
)
@ECHO关闭
设置“根路径=%~1”
对于(“%rootpath%\*”)中的/D%%D,请执行以下操作(
设置cnt=0
对于/F%%K IN('DIR/A-D/S“%%D”2^>num^查找“文件”^^^^^^ ECHO 0'),请执行以下操作(
设置/A cnt+=%%K
)
SETLOCAL EnableDelayedExpansion
回声%%D:!cnt!
端部
)
除了
DIR
的输出现在可能包含多个摘要之外,修改后的版本的工作原理与原始版本几乎相同。脚本从每个摘要中提取文件计数,并将所有计数相加,以获得目录树中的总文件计数。显示结果时,在这种情况下需要启用延迟扩展,因为总计数存储在环境变量(
cnt
)中,在这种情况下,使用“正常”(立即)扩展无法正确计算环境变量


另一个注意事项是,两个版本在显示子目录名称时都会显示路径。如果您只想要姓名(根据您对另一个答案的一条评论,您似乎是这样做的),请使用
ECHO%%~nxD:…
而不是
ECHO%%D:…

这里有一个稍微不同的方法

下面的脚本迭代指定目录的子目录,为每个子目录调用
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
)
@ECHO关闭
设置“根路径=%~1”
对于(“%rootpath%\*”)中的/D%%D,请执行以下操作(
设置cnt=0
对于/F%%K IN('DIR/A-D/S“%%D”2^>num^查找“文件”^^^^^^ ECHO 0'),请执行以下操作(
设置/A cnt+=%%K
)
SETLOCAL EnableDelayedExpansion
回声%%D:!cnt!
端部
)
除了
DIR
的输出现在可能包含多个摘要之外,修改后的版本的工作原理与原始版本几乎相同。脚本从每个摘要中提取文件计数,并将所有计数相加,以获得目录树中的总文件计数。显示结果时,在这种情况下需要启用延迟扩展,因为总计数存储在环境变量(
cnt
)中,在这种情况下,使用“正常”(立即)扩展无法正确计算环境变量

另一个注释是tha