0

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

这里概述了我到底想要什么:

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

O/p 将是:

文件夹 1:23

文件夹 2:34

文件夹 3:12

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

4

2 回答 2

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: ....

于 2013-02-03T17:06:21.937 回答
1

编辑

我已经重新设计了这个。该示例使用两个批处理文件;test.cmdfilecount.cmd

test.cmd仅迭代目录,并调用filecount.cmd每个目录。

您只需显式运行该test.cmd文件,该文件依次调用filecount.cmd文件计数,并生成如下所示的输出,这是我刚才简短测试的实际输出。如果您不想计算主目录中的文件数,只需从第一个批处理文件中省略该行。

.: 7
folder1: 3
folder2: 2
folder3: 5

该示例假定批处理文件与您计算文件的目录位于同一目录中。

测试.cmd:

@echo off
setlocal

call filecount .

for /f %%f in ( 'dir /AD /b' ) do (
    call filecount %%f
)

:EOF
endlocal

文件计数.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 这样的东西。

于 2013-02-03T08:49:39.840 回答