首页 > 解决方案 > 批处理列表文件夹,统计pdf文件并获取文件名

问题描述

我想创建一个我每周从其他部门收到的所有文件的摘要。文件夹结构如下图。每个文件夹将包含多个 pdf 文件和只有 1 个 .docx 文件。因此,我想列出文件夹名称,计算其中的 pdf 文件总数并获取 docx 文件的名称。如果 docx 丢失,显示“丢失”,这也可能吗?

我确实尝试了这段代码,但这将显示文件夹中的所有文件。

@echo off
FOR /F "delims=" %%F IN ('dir /B /A /S *') DO (
for %%D in ("%%~dpF\.") do echo/ FolderName: %%~nxD ^| FileName: %%~nxF
)
pause

更新:今天我在测试建议的代码时,他们上周向我发送了文件。令我惊讶的是,另一个部门改变了文件夹结构(facepalm!)。下面更新了文件夹结构以供参考。

更新的文件夹结构:

Current
|count.bat
|--FolderA-Folder1-Nov 2020.docx
|                 -pdf1.pdf
|                 -pdf2.pdf
|                 -pdf3.pdf
|                 -pdf4.pdf
|          Folder2-Dec 2020.docx
|                 -pdf1.pdf
|                 -pdf2.pdf
|                 -pdf3.pdf
|                 -pdf4.pdf
|--FolderB-Folder1-Nov 2020.docx
|                 -pdf1.pdf
|                 -pdf2.pdf
|                 -pdf3.pdf
|                 -pdf4.pdf
|          Folder2-Dec 2020.docx
|                 -pdf1.pdf
|                 -pdf2.pdf
|                 -pdf3.pdf
|                 -pdf4.pdf
|--FolderC-Folder1-Nov 2020.docx
|                 -pdf1.pdf
|                 -pdf2.pdf
|                 -pdf3.pdf
|                 -pdf4.pdf

预期结果

FolderName: Folder A Folder 1    PDFtotal: 4pdfs   DocFile: Nov 2020.docx
FolderName: Folder A Folder 2    PDFtotal: 4pdfs   DocFile: Dec 2020.docx
FolderName: Folder B Folder 1    PDFtotal: 4pdfs   DocFile: Nov 2020.docx
FolderName: Folder B Folder 2    PDFtotal: 4pdfs   DocFile: Dec 2020.docx
FolderName: Folder C Folder 1    PDFtotal: 4pdfs   DocFile: Nov 2020.docx

标签: windowsbatch-filecmd

解决方案


原始脚本

不带选项的dir命令/B在倒数第二行显示匹配项的计数,可以通过for /F循环捕获和解析。

由于您有一个平面目录结构,我不会使用递归方法(如dir /Sor for /R)。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=."         & rem // (target directory; `.` is current, `%~dp0.` is parent)
set "_MASK=Doc*.docx" & rem // (pattern to find particular file)
set _LIST="pdf"       & rem // (space-separated list of file extensions without `.`)

rem // Loop through immediate sub-directories of the target directory:
for /D %%D in ("%_ROOT%\*") do (
    rem // Return name of current sub-directory without trailing line-break:
    < nul set /P ="FolderName: %%~nxD    "
    rem // Loop through given list of file extensions:
    for %%E in (%_LIST%) do (
        rem // Initialise variables:
        set /A "CNT=0, NUM=0" & set "NAME="
        rem // Capture number of matching files from last but one line of `dir`:
        for /F "eol= " %%C in ('2^> nul dir /A:-D-H-S "%%~D\*.%%~E"') do (
            2> nul set /A "CNT=NUM, NUM=%%C"
        )
        rem // Return count of matching files without trailing line-break:
        < nul call set /P ="PDFtotal: %%CNT%%%%~Es   "
    )
    rem // Find file that matches the given pattern (assuming there is only one):
    for %%F in ("%%~D\%_MASK%") do set "NAME=%%~nxF"
    rem // Return name of found file, with trailing line-break this time:
    call echo DocFile: %%NAME%%
)

endlocal
exit /B

/A:-D-H-S代码中命令的选项dir防止隐藏和系统文件被统计;/A:-D如果您也想考虑它们,请将其更改为。


更新的脚本

在下文中,您将找到适应您更改的目录结构的新代码(您会注意到只需要进行一些修改):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=."           & rem // (target directory; `.` is current, `%~dp0.` is parent)
set "_MASK=* 2020.docx" & rem // (pattern to find particular file)
set _LIST="pdf"         & rem // (space-separated list of file extensions without `.`)

rem // Loop through immediate sub-directories of the target directory:
for /D %%S in ("%_ROOT%\*") do (
    rem // Loop through next level of sub-directories:
    for /D %%D in ("%%~S\*") do (
        rem // Return names of current sub-directories without trailing line-break:
        < nul set /P ="FolderName: %%~nxS %%~nxD    "
        rem // Loop through given list of file extensions:
        for %%E in (%_LIST%) do (
            rem // Initialise variables:
            set /A "CNT=0, NUM=0" & set "NAME="
            rem // Capture number of matching files from last but one line of `dir`:
            for /F "eol= " %%C in ('2^> nul dir /A:-D-H-S "%%~D\*.%%~E"') do (
                2> nul set /A "CNT=NUM, NUM=%%C"
            )
            rem // Return count of matching files without trailing line-break:
            < nul call set /P ="PDFtotal: %%CNT%%%%~Es   "
        )
        rem // Find file that matches the given pattern (assuming there is only one):
        for %%F in ("%%~D\%_MASK%") do set "NAME=%%~nxF"
        rem // Return name of found file, with trailing line-break this time:
        call echo DocFile: %%NAME%%
    )
)

endlocal
exit /B

推荐阅读