批处理文件以计算子目录中的文件类型

4

我需要一个批处理文件,用于在子目录中计算特定的文件类型。在这个案例中,它是 .txt 和 .xls 文件。在文件结尾处,它会将结果返回。

@echo off
REM get script directory
set scriptdir=%~dp0
REM change directory to script directory
cd /d %scriptdir%
setlocal
set txtcount=0
set xlscount=0
for %%x in ('dir *.txt /s ) do set /a txtcount+=1
for %%x in ('dir *.xls /s ) do set /a xlscount+=1
echo %txtcount% text files
echo %xlscount% .xls files
endlocal
pause

我的批处理文件没有正确报告文件数量。我认为它可能一直在计数,但是我已将计数变量设置为本地变量,所以我不确定问题出在哪里。


2
你应该始终包含具体的示例,说明脚本/程序正在执行的操作(而不仅仅是“错误计数”),以及您期望/希望它成为什么样子。在这种情况下,您的for循环内部并没有按照您想象的那样运行:它正在运行'dir,当前目录中的每个文本文件和/s。您可能会发现for /r %%x in (*.txt) do...更好地工作。 - TripeHound
1
有时候阅读你正在尝试使用的命令的帮助文档,会帮助你自己解决问题。 - Squashman
2个回答

6

你的脚本有三个问题:

  • 你想迭代命令输出,所以需要使用FOR /F
  • 你没有使用“裸”/B格式,即DIR输出的不仅仅是文件名
  • 你两次漏掉了结束单引号

请使用以下代码替换你的循环:

FOR /F %%X IN ('DIR /S /B *.txt') DO SET /A "txtcount+=1"
FOR /F %%X IN ('DIR /S /B *.xls') DO SET /A "xlscount+=1"

4
你离正确答案很近,但是你忘记了 /B 开关,它在dir 命令中,因此输出包含头和尾,这两个都被计入了。因此,请将 dir *.txt /s 更改为 dir *.txt /s /b*.xls 同理),这样计数就会正确。

除此之外,还有一些错别字:缺少闭合的 ' -- for %%x in ('dir *.txt /s') do ...。另外,在 for 中需要添加 /F 开关,以捕获命令的输出。(我假设这些内容在真实的脚本中是存在的,否则你会收到错误提示。)


替代方法

要统计文件数量,你也可以采用以下方法:

for /F "delims=" %%X in ('dir /B /S "*.txt" ^| find /C /V ""') do set "COUNT=%%X"

find /V "" 是搜索非空行的命令,因此 dir /B /S 返回的所有行都被视为匹配项;/C 开关允许 find 返回匹配行的总数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接