Batch file 使用cmd根据文件名模式计算文件数

Batch file 使用cmd根据文件名模式计算文件数,batch-file,Batch File,我有一个文件夹,里面有一堆各种各样的文本文件。文件名的构造使得文件名中有一个主体和一个日期,例如: AAA_20150630.txt AAA_20150629.txt BBB_20150630.txt CCC_20150630.txt CCC_20150701.txt 现在我想计算每种类型的文件有多少个文件,因此在这种情况下,期望的结果是: AAA 2 BBB 1 CCC 2 我还有另一个文本文件,filelist.txt,它列出了所有可能的类型,即 AAA BBB CCC 我正在尝试

我有一个文件夹,里面有一堆各种各样的文本文件。文件名的构造使得文件名中有一个主体和一个日期,例如:

AAA_20150630.txt 
AAA_20150629.txt
BBB_20150630.txt
CCC_20150630.txt
CCC_20150701.txt 
现在我想计算每种类型的文件有多少个文件,因此在这种情况下,期望的结果是:

AAA 2
BBB 1
CCC 2
我还有另一个文本文件,
filelist.txt
,它列出了所有可能的类型,即

AAA
BBB
CCC
我正在尝试构建一个CMD脚本,它将循环遍历
filelist.txt
的行,并计算文件夹中每种类型文件的发生次数

到目前为止,我一直在遵循有问题的建议,成功地构建了一个脚本,用于计算单个文件类型出现的次数(%source_dir%是我之前设置的文件夹):

但是,我在尝试围绕此循环构建另一个for循环时遇到了一个问题,以便遍历filelist中列出的所有文件类型:

for /f %%i in (%filelist%) do (
    set count=0
    for /f %%j in ('dir /b /a-d %source_dir%\%%i_* ^| find /c /v ""') do set count=%%j
    echo number of %%i files = %count%
)
此代码不起作用:它在所有行中循环,但只计算%filelist%中第一项的实际数量,然后返回所有连续项的结果


为什么会发生这种情况?我如何修复它?

您需要使用
延迟扩展在循环和ifs内使用变量:

@echo off
setlocal EnableDelayedExpansion
for /f %%i in (%filelist%) do (
    set count=0
    for /f %%j in ('dir /b /a-d !source_dir!\%%i_* ^| find /c /v ""') do set count=%%j
    echo number of %%i files = !count!
)
pause

这里有一个更简单的选择

@echo off
setlocal

set "sourcedir=path\to\some\folder"

for /f %%I in (filelist.txt) do (
    for %%A in (%sourcedir%\%%I*) do set /a count[%%I] += 1
)

set count

它也应该更有效率。

啊,我明白了,谢谢!事实上,我之前已经延迟了扩展设置,但还没有弄清楚感叹号。新手失误!很好,谢谢。额外的效率是通过不必执行单独的“find”命令来实现的?我注意到我原来的剧本有点慢。然而,由于my filelist.txt不太可能有超过30个条目,所以我们只讨论几秒钟。如果其他人使用更大的列表执行类似的操作,这显然是一种更好的方法。它的效率更高,因为它不必执行
find
,而且
for
for/f
更快。
@echo off
setlocal

set "sourcedir=path\to\some\folder"

for /f %%I in (filelist.txt) do (
    for %%A in (%sourcedir%\%%I*) do set /a count[%%I] += 1
)

set count