从Windows命令行获取文件夹大小


128

在Windows中是否可以在不使用任何第三方工具的情况下从命令行获取文件夹的大小?

我希望获得与在Windows资源管理器→属性中右键单击文件夹时获得的结果相同的结果。

Answers:


120

您可以递归地添加大小(以下是批处理文件):

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

但是,由于cmd限于32位带符号整数运算,因此存在几个问题。因此,它将获得大于2 GiB的大小错误1。此外,它可能会多次计算符号链接和结点,因此充其量只是一个上限,而不是实际大小(不过,使用任何工具都会遇到这个问题)。

另一种方法是PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length

或更短:

ls -r | measure -sum Length

如果您希望它更漂亮:

switch((ls -r|measure -sum Length).Sum) {
  {$_ -gt 1GB} {
    '{0:0.0} GiB' -f ($_/1GB)
    break
  }
  {$_ -gt 1MB} {
    '{0:0.0} MiB' -f ($_/1MB)
    break
  }
  {$_ -gt 1KB} {
    '{0:0.0} KiB' -f ($_/1KB)
    break
  }
  default { "$_ bytes" }
}

您可以直接从cmd以下位置使用:

powershell -noprofile -command "ls -r|measure -sum Length"

1我确实在批处理文件中有一个部分完成的bignum库,该库至少在某个位置具有任意精度的整数加法。我应该释放它,我想:-)


+1我只是在get-help *输出中徘徊,找到了类似的东西。
2012年

2
史蒂夫,在我看来,PowerShell比Unix更具Unix-y的优势,因为大多数核心命令实际上都是正交的。在Unix中du提供目录大小,但是它要做的只是走树并进行总结。可以在这样的管道中非常优雅地表达一些东西:-)。因此,对于PowerShell,我通常会寻找如何将高级目标分解为合适的低级操作。
2012年

3
我明白了,这似乎忽略了隐藏的文件夹。如果我也想包括隐藏文件夹,则ls -force -r可以工作。
garg

2
folder\*对我不起作用我放置的文件夹大小显示0字节,有什么解决办法吗?
IT研究人员

2
更好看的版本:powershell -noprofile -command“'{0:N0}'-f(ls -r | measure -s Length)。Sum”
zumalifeguard

120

为此有一个内置的Windows工具

dir /s 'FolderName'

这将打印很多不必要的信息,但最后将是如下所示的文件夹大小:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

如果需要包括隐藏文件夹,请添加/a


7
如果您不需要整数返回值,这是最优雅的解决方案。注意:“ / a”开关将以总大小包含隐藏文件和系统文件。
Oran D. Lord

1
我想不可能以更有用的单位(例如kB或MB)打印文件大小,对吗?
David FerenczyRogožan18年

用双引号代替单引号。
user2924019

66

我建议从此链接http://technet.microsoft.com/en-us/sysinternals/bb896651从Microsoft提供的Sysinternals Suite下载实用程序DU。

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
   -c     Print output as CSV.
   -l     Specify subdirectory depth of information (default is all levels).
   -n     Do not recurse.
   -q     Quiet (no banner).
   -u     Count each instance of a hardlinked file.
   -v     Show size (in KB) of intermediate directories.


C:\SysInternals>du -n d:\temp

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

Files:        26
Directories:  14
Size:         28.873.005 bytes
Size on disk: 29.024.256 bytes

当您使用它时,请查看其他实用程序。它们是每个Windows Professional的救生员


11
我猜这几乎“没有任何第三方工具”。
2012年

11
哦,对,但它认为不应将家庭视为“第三党”。
史蒂夫·

1
好吧,当然,但这仍然是一个额外的下载(\\live.sysinternals.com如果仍然存在,请使用)。我完全同意,默认情况下应包括所有sysinternals工具。尽管对于许多用途而言,PowerShell是非常值得的替代品。
2012年

1
有人说过Powershell吗?尝试以下操作:“ {0:N2}” -f((Get-ChildItem C:\ Temp -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB)+“ MB”
John Homer

3
我建议大家下载Mark Russinovich开发的所有软件:)每当我找到可以挽救生命的工具时,我都会不断看到这个名字。
dkellner

46

Oneliner:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

相同,但仅适用于Powershell:

$fso = new-object -com Scripting.FileSystemObject
gci -Directory `
  | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
  | sort Size -Descending `
  | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

这将产生以下结果:

Size [MB]  FullName
---------  --------
580,08     C:\my\Tools\mongo
434,65     C:\my\Tools\Cmder
421,64     C:\my\Tools\mingw64
247,10     C:\my\Tools\dotnet-rc4
218,12     C:\my\Tools\ResharperCLT
200,44     C:\my\Tools\git
156,07     C:\my\Tools\dotnet
140,67     C:\my\Tools\vscode
97,33      C:\my\Tools\apache-jmeter-3.1
54,39      C:\my\Tools\mongoadmin
47,89      C:\my\Tools\Python27
35,22      C:\my\Tools\robomongo

1
有没有办法在基本文件夹中显示所有文件和Mb大小?在这种情况下,C:\ my \ Tools
Raunak Thomas

2
另外,如果有很多文件夹(例如,在C:驱动器中)
也会中断

0.00 C:\Windows我可以为所有文件夹优化此设置

很好,但是它会截断我的组件文件夹名称。完整显示它们的命令是什么?
sean.net

@ sean.net您是说如果文件夹很长,它以“ ...”结尾吗?这就是ftFormat-Table)的工作方式。您可以fl改用(Format-List
frizik

16

如果您的计算机上已经安装了git(越来越常见),只需打开MINGW32并输入: du folder


4
du -h -d 1 folder | sort -h如果您希望人类可读的大小,仅一个级别的子目录并按大小排序,则可以使用以下命令。
vard

8

我建议使用https://github.com/aleksaan/diskusage实用程序。非常简单而且有用。而且非常快。

只需输入命令外壳

diskusage.exe -path 'd:/go; d:/Books'

并获取按大小排列的文件夹列表

  1. | DIR:d:/ go | 大小:325.72 Mb | 深度:1
  2. | DIR:d:/书籍| 大小:14.01 Mb | 深度:1

此示例在HDD上以272ms执行。

您可以增加要分析的子文件夹的深度,例如:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

并不仅获取所选文件夹的大小,还获取其子文件夹的大小

  1. | DIR:d:/ go | 大小:325.72 Mb | 深度:1
  2. | DIR:d:/ go / pkg | 大小:212.88 Mb | 深度:2
  3. | DIR:d:/ go / src | 大小:62.57 Mb | 深度:2
  4. | DIR:d:/ go / bin | 大小:30.44 Mb | 深度:2
  5 | DIR:d:/书籍/国际象棋| 大小:14.01 Mb | 深度:2
  6. | DIR:d:/书籍| 大小:14.01 Mb | 深度:1
  7 | DIR:d:/ go / api | 大小:6.41 Mb | 深度:2
  8 | DIR:d:/ go / test | 大小:5.11 Mb | 深度:2
  9 | DIR:d:/ go / doc | 大小:4.00 Mb | 深度:2
 10 | DIR:d:/ go / misc | 大小:3.82 Mb | 深度:2
 11 | DIR:d:/ go / lib | 大小:358.25 Kb | 深度:2

*服务器上的3.5Tb已扫描3m12s


新版本发布! github.com/aleksaan/diskusage改进 :1)使用symlink的大小正确地工作2)orevall有关被分析对象的信息
Alexander Anufriev,

版本2.0.2已发布!github.com/aleksaan/diskusage/releases/tag/v2.0.2- 配置文件而不是内联参数-简单的使用模式(将diskusage可执行文件复制到任何文件夹中,运行它并获取结果)-正确的结果输出(正确的行尾符号赢) / unix)-将结果保存到文件或以控制台方式获取(选项“ tofile”)
Alexander Anufriev

请注意您是作者。(来自stackoverflow.com/help/promotion“但是,您必须在答案中公开您的隶属关系。”
aeracode

6

这是我编写的powershell代码,用于列出当前目录下所有文件夹的列表大小和文件计数。可以根据需要随意重用或修改。

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}

为我工作。如果在无头服务器上,则很有用。
安德鲁·帕特

简洁大方!我的版本: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } 这将提供对象(更多Powershell风格的对象),“ FileCount”和“ Size”是整数(因此,以后可以根据需要对其进行处理),并且“ Size”以字节为单位,但是您可以轻松地将其转换为GB(或您想要的单位)$Data.Size / 1GB
curropar

还是$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
单线

2

此代码已经过测试。您可以再次检查。

@ECHO OFF
CLS
SETLOCAL
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location.
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp
SET /P nline=<%TEMP%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE

谢谢,它对我来说适用于小于1GB的文件夹,但是例如,我有一个3,976,317,115字节(3.70GB)的文件夹,并且脚本向我返回了这个字符串“)932”,您知道为什么吗?
elady 2014年

2

我猜这只有在目录是相当静态的并且目录的内容在两个dir命令的执行之间不变的情况下才有效。也许可以将其组合为一个命令来避免这种情况,但这对我来说是可行的(我不想要完整的清单;只是摘要)。

GetDirSummary.bat脚本:

@echo off
rem  get total number of lines from dir output
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i
rem  dir summary is always last 3 lines; calculate starting line of summary info
set /a summaryStart="lineCount-3"
rem  now output just the last 3 lines
dir /S %1 | more +%summaryStart%

用法:

GetDirSummary.bat c:\ temp

输出:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free

1

我得到du.exe了我的git发行版。另一个地方可能是前面提到的Microsoft或Unxutils

一旦您在路径中找到du.exe。这是你的fileSizes.bat:-)

@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"

___________
DIRECTORIES
37M     Alps-images
12M     testfolder
_____
FILES
765K    Dobbiaco.jpg
1.0K    testfile.txt
_____
TOTAL
58M    D:\pictures\sample

1

我认为您唯一的选择是污垢(高度支持的第三方解决方案):

从命令行获取文件/目录大小

遗憾的是,Windows CLI的限制非常严格,您可以选择安装Cygwin,与cmd相比,这是一个梦想。这样您就可以访问移植的Unix工具du,这是在Windows上滥用的基础。

抱歉,我无法使用可以在本机cli上运行的命令直接回答您的问题。


1
如果您只需要duCygwin,那就太过头了。只需使用GnuWin32即可
2012年

2
确实,这太过分了,但也很棒。为您在@joey上方的帖子+1(没有代表如实进行:()
Illizian 2012年

以我的拙见,Cygwin对某些人可能有用,但远非令人敬畏和令人恐惧。但是我猜Unix用户对Wine也这么说。
2012年

1
“酒”-不寒而栗,我在开发笔记本电脑上使用Cygwin,因为在Linux下电池寿命令人震惊,并且在其上运行VM也不方便。它需要一些设置,但是Cygwin对于我们当中那些错过Windows nix shell的人来说非常出色,我个人不喜欢Powershell,尽管我可能不得不检查GnuWin。谢谢@乔伊。
伊利兹州(Illizian)2012年

1

::获取Dir命令返回的行数(/ -c消除数字分隔符:。,)[“ Tokens = 3”仅查看Dir中每行的第三列]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

倒数第二行的编号,其中是文件总和的字节数:

set /a line=%i%-1

最后获得倒数第二行-第三列中的字节数:

set i=0
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
  set /a i=!i!+1
  set bytes=%%a
  If !i!==%line% goto :size  
)
:size
echo %bytes%

由于它不使用单词搜索,因此不会出现语言问题。

局限性:

  • 仅适用于小于2 GB的文件夹(cmd无法处理大于32位的数字)
  • 不读取内部文件夹的字节数。

1

尝试:

SET FOLDERSIZE=0
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

将C:\ Program Files更改为所需的任何文件夹,如果在批处理文件中使用,则将%A更改为%% A

它返回整个文件夹的大小,包括子文件夹和隐藏文件以及系统文件,并且可以处理超过2GB的文件夹

它确实会写入屏幕,因此如果您不想使用临时文件,则必须使用它。


1

以下脚本可用于获取和累积给定文件夹下每个文件的大小。
文件夹路径%folder%可以作为该脚本的参数(%1)。
最终,结果保存在参数中%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

注意:该方法calcAccSize还可以打印文件夹的内容(在上面的示例中进行了注释)


1

因此,这是按照您最初要求的方式针对您的两个请求的解决方案。它将提供人类可读的文件大小,而没有每个人都遇到的文件大小限制。与Win Vista或更高版本兼容。XP仅在安装了Robocopy的情况下可用。只需在此批处理文件上放置一个文件夹或使用下面提到的更好的方法即可。

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

为了能够方便地使用此批处理文件,请将其放在您的SendTo文件夹中。这将允许您右键单击一个文件夹或选择的文件夹,单击SendTo选项,然后选择此批处理文件。

要在计算机上找到SendTo文件夹,最简单的方法是打开cmd,然后按原样复制此行。

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo


对于任何担心Robocopy会移动文件的人。/ l选项仅列出。另外,Robocopy不是第三方,Robocopy默认是从Windows Vista开始安装在Windows中,需要安装XP。
julesverne

感谢您的添加。很高兴看到此线程仍吸引注意;-)可能想添加如何安装robocopy(强大的工具!)。
Eldad Assis,

0

我解决了类似的问题。此页面中的某些方法很慢,而在多语言环境中则有些问题(均假设为英语)。我发现在cmd中使用vbscript的简单解决方法。在W2012R2和W7中经过测试。

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

设置环境变量S_。当然,您可以更改最后一行以将结果直接显示为例如

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

您可以将其用作子例程或独立的cmd。参数是用引号关闭的测试文件夹的名称。


-3

仅获得总大小的最简单方法是使用powershell,但是仍然受到以下事实的限制:总长度中不包含超过260个字符的路径名


2
这是一个不好的回答。什么是命令行或代码?
塔塔林2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.