【问题标题】:Counting files and directories at each directory level from a batch file从批处理文件中计算每个目录级别的文件和目录
【发布时间】:2017-12-22 12:44:00
【问题描述】:

我已经成功使用了一个批处理文件来计算根目录中文件和目录的总数。

目录结构:

这是当前脚本:(获取返回子文件夹直到第 n 个子文件夹的文件和文件夹的数量)

@echo off
set "drive=D:\Download\app"
for /d %%r in ("%drive%\*") do (
    echo Path: %%~fr
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s %%~fr ^| find /i "bytes"') do if "%%j"=="File(s)" (
        set numfiles=%%i
    )ELSE (
        for /f %%a in ('dir /b /s /ad %%~fr ^|find /c /v "" ') do set numfolders=%%a)
    echo Files: %numfiles%
    echo Folds: %numfolders%
)

程序首先输出根目录中的文件总数文件夹总数,然后转到第一个子文件夹并为整个树输出相同的内容,然后它移动到该级别的下一个文件夹等。

编辑

我已经完成了进入 1 级子文件夹并获取文件和文件夹总数的部分,但我希望它最多 N 个子文件夹,这意味着它应该输出根目录中每个文件夹的总数.

这是扩展代码。

@echo off
setLocal EnableDelayedExpansion 
set "drive=C:\Users\%USERNAME%\Downloads\Sandukchi"
set numfiles=
set numfolders=
set count=0;
for /d %%r in ("%drive%\*") do (
    echo %%r
    SET /A count=count + 1
    for /d %%a in ("%%r\*") do set modifiedDate=%%~ta
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "File(s)"') do set fileSizeBytes=%%k
    for %%* in ("%%r") do set folderName=%%~nx*
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "bytes"') do if "%%j"=="File(s)" (
        set numfiles=%%i
    )ELSE (
        for /f %%a in ('dir /b /s /ad "%%r\*" ^|find /c /v "" ') do set numfolders=%%a)
    echo Last Modified Date: !modifiedDate!
    echo Folder Size: !fileSizeBytes! KB
    echo Total Number of Files: !numfiles!
    echo Total Number of Folders: !numfolders!
    (
        echo !count!    %%r     !folderName!        !modifiedDate!  Total Size  !fileSizeBytes!KB   Total Files !numfiles!  Total Folder  !numfolders! 
        echo.
    )>>output.txt
)

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:
    @ECHO Off
    SETLOCAL
    SET "sourcedir=."
    SET "tempfile=%temp%\##__##.txt"
    SET "dirname="
    (
    FOR /f "tokens=1,2,*delims= " %%w IN (
     'dir /s "%sourcedir%\*" '
     ) DO (
     IF "%%w"=="Directory" (
      SET "dirname=%sp256%%%y"&SET /a fcnt=0&SET /a dcnt=-2
     ) ELSE (
      FOR /f "delims= " %%p IN ("%%y") DO (
       IF "%%p"=="<DIR>" SET /a dcnt+=1
      )
     )
     IF "%%x"=="File(s)" CALL ECHO %%dirname%%*%%w*%%dcnt%%
    )
    )>"%tempfile%"
    FOR /f "tokens=1,2,*delims=*" %%a IN ('sort "%tempfile%"') DO ECHO directory %%a&ECHO     files %%b&echo   subdirs %%c
    
    GOTO :EOF
    

    您需要更改sourcedir 的设置以适应您的情况。

    生成一个临时文件。没有尝试删除临时文件,因为它可能包含有用的数据。

    运行标准的dir/s 命令,并选择以directory 开头的行(表示新目录名)和第三个空格分隔的标记为&lt;DIR&gt; 的行,用于计算子目录。当出现带有第二个标记File(s) 的行时,将名称、文件计数和目录计数输出到临时文件。

    对临时文件和报告进行排序。

    注意:%%y 包含从每行开始的第三个标记。这是重新标记,仅选择第一个标记(默认)为%%p 隔离原始行的第三个标记。

    使用* 作为分隔符生成临时文件,因为* 不是有效的文件名字符。

    dcnt 设置为-2 以启动目录计数,因为...dir /s 中报告为目录名。

    【讨论】:

    • 它运行良好,但没有显示子目录的总数。它一直显示-2。
    • 这意味着dcnt 没有增加。可能是 %%p 从未设置为 &lt;DIR&gt; 或者存在转录错误(最好是剪切和粘贴)。如果您在do 块中为for...%%p... 设置echo %%p &gt;con:,那么您应该看到%%p 中设置的内容。类似地显示%%y 可能会有所帮助。
    【解决方案2】:

    试试这个代码:

    @echo off
    Setlocal EnableDelayedExpansion
    @For /D  %%D in (*) DO (
        Set "Folder=%%~D"
        PUSHD "!Folder!"
            FOR /F %%H in ('dir /a-d /b 2^>NUL^|find /C /V "" ') DO ( Set "numFiles=%%H" )
            FOR /F %%I in ('dir /ad  /b 2^>NUL^|find /C /V "" ') DO ( Set "numSubFolders=%%I" )
        POPD
        echo The Folder "!Folder!" has !numSubFolders! SubFolders and !numFiles! Files      
        )
    )
    pause & exit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2023-03-12
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多