【问题标题】:How to list all folder with size via batch file如何通过批处理文件列出所有大小的文件夹
【发布时间】:2014-03-09 18:57:06
【问题描述】:

我想要一个简单的解决方案,以 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

它只会生成每个文件夹的大小.. 我该如何进行?任何帮助

【问题讨论】:

标签: windows batch-file size directory dir


【解决方案1】:

对于列表中的每个文件夹,使用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,添加了声明和使用示例。
  • 谢谢@MC ND ...它的工作我已经添加了一个文件名,用于在一个地方附加所有列表...谢谢
  • 只是尝试自定义输出.... 而 BYETS 输出将以 KB 形式出现 .... 我尝试了 "size=%%~b"/1024!size!/1024 ... 但它正在打印所有... . :(
  • @goldenbutter, set /a "size=%%~b/1024" 但是,在批处理文件中,算术限制为 32 位有符号整数。如果您有一个包含超过 2GB 数据的文件夹,那么您将无法这样做。如果不需要绝对精度,可以回显!size:~0,-3!,或者需要添加代码来处理。
【解决方案2】:

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

【讨论】:

  • 太棒了....完美运行....感谢您格式化 UNIT....@Matt Willamson
  • 这个运行但是它只列出顶层的文件夹并且不会递归地遍历所有文件夹...建议?
  • 如何处理大于 32 位整数的大目录?某些 GB 和 TB 之类的东西?
  • @Drew 它似乎在您放置/运行它的级别上递归很好,您的意思是您也想查看中间结果(也就是每个子文件夹和子子文件夹的大小等) ?
【解决方案3】:

我采用了@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

【讨论】:

    【解决方案4】:

    我的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。

    【讨论】:

      【解决方案5】:

      在 Windows 上尝试

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

      【讨论】:

        【解决方案6】:

        如果您使用的是 windows 7 或新的使用 powershell 并输入命令

        ls-r >> log.txt

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

        【讨论】:

        • 这不会提供“folder1 # 100 MB”样式的输出,也就是递归地迭代子文件夹并汇总其中文件的文件大小
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2018-10-06
        • 1970-01-01
        相关资源
        最近更新 更多