我需要一个批处理文件来计算子目录中的某些文件类型。在这种情况下,它是.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
我的批处理文件没有报告正确的文件数。我认为它可能会不断计算,但我已将计数变量设置为本地,因此我不确定是什么。
答案 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
返回匹配行的总数。