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

时间:2014-02-11 19:26:07

标签: windows batch-file size directory dir

我想要一个简单的解决方案,用于文件夹列表和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

只需生成每个文件夹的大小.. 我该怎么办?任何帮助

5 个答案:

答案 0 :(得分:17)

对于列表中的每个文件夹,使用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),在内部dir命令内执行递归for命令,并从其输出执行末尾的摘要行(由{提取)解析{1}})(findstr命令中的tokens)并检索此子文件夹下所有文件的总大小。然后文件夹的名称(如果有扩展名)和其下的元素大小将回显给控制台。

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

for

答案 1 :(得分:11)

使用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

答案 2 :(得分:1)

我的JREN.BAT utility可用于获取包含尺寸的文件夹列表。它是一个混合JScript /批处理脚本,可以在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。

答案 3 :(得分:1)

如果您使用的是Windows 7或新的使用PowerShell并输入命令

ls-r&gt;&gt; log.txt的

它将列出当前目录中的所有文件以及文件大小(以字节为单位)到日志文件。

答案 4 :(得分:0)

我拿了@Matt Williamsons代码,并将每行导出到运行目录folderSizes.csv中的.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