使用cmd

时间:2016-01-05 10:04:37

标签: 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

我正在尝试构建一个循环遍历filelist.txt行的CMD脚本,并计算文件夹中每种类型文件的出现次数。

到目前为止,我一直在关注this问题中的建议,成功构建一个脚本来计算单个文件出现次数(%source_dir%是我之前设置的文件夹) :

set count=0
for /f %%k in ('dir /b /a-d %source_dir%\AAA_* ^| find /c /v ""') do set count=%%k 
echo number of AAA files = %count%

然而,当我尝试围绕这个构建另一个for循环时遇到问题,以便遍历文件列表中列出的所有类型的文件:

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%中第一项的实际数字,然后返回所有连续的结果。

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:0)

您需要使用!进行延迟扩展才能在循环和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

答案 1 :(得分:0)

这里有一个更简单的选择。

@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

它也应该更有效率。