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

时间:2017-01-13 11:14:13

标签: windows batch-file

我需要一个批处理文件来计算子目录中的某些文件类型。在这种情况下,它是.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 个答案:

答案 0 :(得分:4)

您的脚本存在三个问题:

  • 您希望迭代命令输出,因此需要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"

答案 1 :(得分:4)

你非常接近,但是你错过了dir command的开关/B,因此输出包含一个页眉和一个页脚,它们都包含在计数中。因此,将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返回匹配行的总数。