文件夹列表及其大小

时间:2016-05-12 06:33:05

标签: batch-file

我有一个父文件夹,其中包含100多个子文件夹。我想要一个包含子文件夹及其大小的文本文件。你能帮我建一下批处理程序吗?

3 个答案:

答案 0 :(得分:0)

仅对于没有大小的文件名,您可以使用此代码 -

dir *.* /b /s >> C:\ListOfFile.txt

将“C:\”路径更改为您想要保存文件的时间。

答案 1 :(得分:0)

这段代码可以解决问题:

@echo off
Title Get Size of Folder and its subfolders
set "Folder=C:\temp"
Set Log=Folder_Size.txt 
(
    echo The size of "%Folder%" is 
    Call :GetSize "%Folder%"
)> "%Log%"
For /f "delims=" %%a in ('Dir "%Folder%" /AD /b /s') do ( 
    (
        echo The size of "%%a" is 
        Call :GetSize "%%a"
    )>> "%Log%"
)
start "" "%Log%"
::***********************************************************************
:GetSize
(
echo wscript.echo GetSize("%~1"^)
echo Function GetSize(MyFolder^)
echo    Set fso = CreateObject("Scripting.FileSystemObject"^)
echo    Set objFolder= fso.GetFolder(MyFolder^)  
echo    GetSize = FormatSize(objFolder.Size^)
echo End Function
echo '*******************************************************************
echo 'Function to format a number into typical size scales
echo Function FormatSize(iSize^)
echo    aLabel = Array("bytes", "KB", "MB", "GB", "TB"^)
echo    For i = 0 to 4
echo        If iSize ^> 1024 Then
echo            iSize = iSize / 1024
echo        Else
echo            Exit For
echo        End If
echo    Next
echo    FormatSize = Round(iSize,2^) ^& " " ^& aLabel(i^)
echo End Function
echo '*******************************************************************
)>%tmp%\Size.vbs
Cscript /NoLogo %tmp%\Size.vbs
Del %tmp%\Size.vbs
Exit /b
::***********************************************************************

答案 2 :(得分:0)

虽然你没有表现出任何自己尝试的努力,但我决定帮助你,因为这项任务可能不是特别容易实现的......

您是否见过dir /S的输出(列出指定目录及其所有子目录中文件的命令)?它总结了最后文件的总数,包括整体大小:

D:\TEMP>dir /S /-C
 Volume in drive D is DATA
 Volume Serial Number is XXXX-XXXX

 Directory of D:\TEMP

2016/05/12  12:00    <DIR>          .
2016/05/12  12:00    <DIR>          ..
               0 File(s)              0 bytes

     Total Files Listed:
               0 File(s)              0 bytes
               2 Dir(s)      ?????????? bytes free

因此,我们可以为给定位置的每个目录执行dir /S命令,使用for /F循环捕获其输出,检索最后一行之前的行并提取大小值。

以下纯脚本 - 我们称之为folder_sizes.bat - 完成以下步骤:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Get provided arguments:
set "FOLDER=%~1"
set "LOG=%~2"

rem // Check provided arguments:
if not defined LOG set "LOG=con"
setlocal EnableDelayedExpansion
>&2 (
    if not defined FOLDER (
        echo(ERROR: no directory specified!
        exit /B 1
    ) else if not exist "!FOLDER!\" (
        rem /* (trailing "\" to check for directory) */
        echo(ERROR: directory not found!
        exit /B 1
    )
)

rem // Process all sub-directories of given directory:
> "!LOG!" (
    for /D %%D in ("!FOLDER!\*") do (
        for /F "skip=10 tokens=3" %%F in ('
            dir /S /-C "%%~fD"
        ') do (
            set "BYTES=!VALUE!"
            set "VALUE=%%F"
        )
        setlocal DisableDelayedExpansion
        set "ITEM=%%~nxD"
        setlocal EnableDelayedExpansion
        rem // Return name and size of sub-directory:
        echo(!ITEM!   !BYTES!
        endlocal
        endlocal
    )
)
endlocal

endlocal
exit /B

要在某个目录上运行此脚本 - 例如D:\TEMP - 并将日志数据写入当前目录中的文件folder_sizes.log,请使用以下命令行:

folder_sizes.bat "D:\TEMP" ".\folder_sizes.log"

在脚本中,切换delayed expansion以避免名称中包含exclamantion标记(!)的(子)目录出现问题。

请注意,dir /S命令的输出与语言有关,因此脚本可能无法在英语以外的系统上提供预期结果。在这种情况下,"skip=10 tokens=3"循环的选项字符串for /F,尤其是token选项,需要相应调整。