如何通过批处理文件列出所有文件夹及其大小

18

我希望能够得到一个简单的解决方案,列出文件夹及其大小,以txt或csv格式呈现。

我使用以下代码列出文件夹列表:

dir C:\Temp\*.* /b /a:d > C:\folderList.txt

当前输出

<<folderList.txt>>
folder1
folder2
folder3

期望的输出

<<folderList.txt>>
folder1 # 100 MB
folder2 # 30 MB
folder3 # 110 MB

简单地说,它会生成每个文件夹的大小。我该怎么做?有什么帮助吗?


参见https://dev59.com/lmcs5IYBdhLWcg3wfD9P -- 从Windows命令行获取磁盘使用情况没有很好的方法。 - mbroshi
6个回答

24

对于列表中的每个文件夹,使用dir命令检索文件夹下文件的大小。

@echo off
    setlocal disabledelayedexpansion

    set "folder=%~1"
    if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        echo(%%~nxa # !size!
        endlocal
    )

    endlocal

它遍历指定的文件夹(作为批处理文件的参数传递,如果没有参数则使用当前目录)。对于其中每个文件夹(通过for /d实现),在内部的for命令中执行递归的dir命令,解析其输出中的汇总行(通过findstr提取)并检索出此子文件夹下所有文件的总大小(通过for命令中的tokens)。然后将该文件夹的名称(以及其扩展名,如果有的话)和其下元素的大小回显到控制台。

如果需要创建文件,则将批处理的输出重定向到一个文件。

getSizes.cmd "c:\temp" > C:\folderList.txt

这将如何工作?输出文件在哪里?输入文件夹路径在哪里?请澄清一下。 - goldenbutter
1
@goldenbutter,添加了声明和使用示例。 - MC ND
谢谢 @MC ND ... 它正在工作,我已经添加了一个文件名来将所有列表附加到一个地方... 谢谢 - goldenbutter
只是尝试自定义输出... 而不是 BYETS,输出将以 KB 的形式出现... 我尝试过 "size=%%~b"/1024!size!/1024 ... 但它打印了所有内容.... :( - goldenbutter
@goldenbutter,set /a "size=%%~b/1024" 但是,在批处理文件中,算术运算仅限于32位带符号整数。如果您有一个超过2GB数据的文件夹,则无法以这种方式执行。如果不需要绝对精度,您可以回显!size:~0,-3!,否则您将需要添加代码来处理它。 - MC ND
能否将所有文件和文件夹都列在同一个列表中? @MC ND - goldenbutter

20

使用MC ND优秀的代码,我已经添加了转换为Kb、Mb、Gb等的功能。以防你更喜欢这些格式。

@echo off
setlocal disabledelayedexpansion

set "folder=%~1"
  if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~nxa - !newsize! !unit!
        endlocal
    )

endlocal
exit /b

:ConvertBytes bytes unit ret
setlocal
if "%~2" EQU "KB" set val=/1024
if "%~2" EQU "MB" set val=/1024/1024
if "%~2" EQU "GB" set val=/1024/1024/1024
if "%~2" EQU "TB" set val=/1024/1024/1024/1024
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\tmp.vbs
exit /b


:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set "unit=Bytes"
if %1 GTR 1024   set "unit=KB"
if %1 GTR 1048576  set "unit=MB"
if %1 GTR 1073741824  set "unit=GB"
if %byt:~-14% GTR %TB:~-14% set "unit=TB"
endlocal & set %~2=%unit%
exit /b

太棒了...完美地运行着...感谢对单元进行格式化...@Matt Willamson - goldenbutter
2
这个程序可以运行,但是它只列出了顶层文件夹,并没有递归遍历所有文件夹...有什么建议吗? - Drew
你将如何处理大小超过32位整数的大型目录?例如某些GB和TB的目录? - Eli Borodach
@Drew,它在您放置/运行的级别上似乎可以很好地递归,您是否想要查看中间结果(即每个子文件夹和子子文件夹等的大小)? - George Birbilis

4
我采用了@Matt Williamsons的代码,并将每一行导出到运行目录下,即folderSizes.csv文件中。它提供了完整的字节大小作为一列,这样你可以轻松地在Excel(或其他软件)中进行排序。
@echo off
echo Getting folder sizes for you...storing to folderSizes.csv
setlocal disabledelayedexpansion
if EXIST folderSizes.csv del folderSizes.csv
echo Folder,Bytes Size,Short Size > folderSizes.csv

set "folder=%~1"
  if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~nxa,!size!,!newsize!!unit! >> folderSizes.csv
        endlocal 
    )

endlocal
exit /b

:ConvertBytes bytes unit ret
setlocal
if "%~2" EQU "KB" set val=/1024
if "%~2" EQU "MB" set val=/1024/1024
if "%~2" EQU "GB" set val=/1024/1024/1024
if "%~2" EQU "TB" set val=/1024/1024/1024/1024
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\tmp.vbs
exit /b


:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set "unit=Bytes"
if %1 GTR 1024   set "unit=KB"
if %1 GTR 1048576  set "unit=MB"
if %1 GTR 1073741824  set "unit=GB"
if %byt:~-14% GTR %TB:~-14% set "unit=TB"
endlocal & set %~2=%unit%
exit /b

2
如果您正在使用Windows 7或更高版本,请使用PowerShell并输入以下命令:ls -r >> log.txt,它将列出当前目录中所有文件以及其字节数到日志文件中。请注意保留HTML标记。

1
这不会提供类似“文件夹1#100 MB”的输出,即递归迭代子文件夹并汇总其中文件的大小。 - George Birbilis

1

我的JREN.BAT实用程序可以用来获取带有大小的文件夹列表。它是一个混合的JScript/batch脚本,可在任何从XP开始的Windows机器上本地运行。

JREN不方便地转换为MB(或任何其他单位)-它只是以字节形式列出大小。但是,获取列表非常方便(并且相对快速):

jren "$" "' # '+size()" /d /j /list /p "d:\temp" >"C:\folderList.txt"

你可以考虑将文件夹大小放在前面,用空格填充到一个固定的宽度,超过最大的文件夹,然后是文件夹名称。我发现这种格式更容易阅读,仍然容易解析:
jren "^" "size('               ')+'  '" /d /j /list /p "d:\temp" >"C:\folderList.txt"

输出将类似于这样
           1852  SomeFolderName
        1616869  Another folder name
         137764  yetAnother

JREN是一个批处理文件,如果您将该命令放在另一个批处理脚本中,则必须使用CALL JREN。


0

尝试在Windows上使用

dir /-c /a /w /s|sed -nr "/:$/q;/:/h;/^\s+[0-9]/{s/.*[^0-9]([0-9]+.*)/\1/;H;g;s/\n/ /p}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接