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

Eld*_*sis 116 windows command-line

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

我想要在右键单击Windows资源管理器→属性中的文件夹时获得相同的结果.

Joe*_*oey 111

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

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

但是,这有几个问题因为cmd仅限于32位有符号整数运算.因此它将获得大于2 GiB的大小错误1.此外,它可能会多次计算符号链接和联结,因此它最多只是一个上限,而不是真正的大小(但是你会遇到任何工具的问题).

另一种方法是PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length
Run Code Online (Sandbox Code Playgroud)

或更短:

ls -r | measure -s Length
Run Code Online (Sandbox Code Playgroud)

如果你想要它更漂亮:

switch((ls -r|measure -s 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" }
}
Run Code Online (Sandbox Code Playgroud)

您可以直接使用cmd:

powershell -noprofile -command "ls -r|measure -s Length"
Run Code Online (Sandbox Code Playgroud)

1我在批处理文件中有一个部分完成的bignum库,它至少可以获得任意精度的整数加法.我应该释放它,我猜:-)

  • 我看,它似乎忽略了隐藏的文件夹.如果我想包含隐藏文件夹,ls -force -r也可以工作. (3认同)
  • 史蒂夫,在我看来,PowerShell比Unix更像Unix-y,因为大多数核心命令都是正交的.在Unix`du`给出了目录大小,但它所做的只是走在树上并总结.可以在这样的管道中非常优雅地表达的东西:-).因此对于PowerShell,我通常会寻找如何将高级目标分解为合适的低级操作. (2认同)
  • `folder\*`对我不起作用,我放在这个地方的文件夹的大小显示0字节,有什么解决方案吗? (2认同)
  • 更好看的版本:powershell -noprofile -command“'{0:N0}'-f(ls -r | measure -s Length)。Sum” (2认同)

Nir*_*uan 104

有一个内置的Windows工具:

dir /s 'FolderName'
Run Code Online (Sandbox Code Playgroud)

这将打印很多不必要的信息,但最终将是这样的文件夹大小:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes
Run Code Online (Sandbox Code Playgroud)

如果需要添加隐藏文件夹/a.

  • 如果您不需要整数返回值,这是最优雅的解决方案.注意:'/ a'开关将包括总大小的隐藏文件和系统文件. (7认同)
  • 我想不可能以更有用的单位打印文件大小,例如 kB 或 MB,对吗? (2认同)

Ste*_*eve 64

我建议从Microsoft提供的Sysinternals Suite下载实用程序DU,网址为 http://technet.microsoft.com/en-us/sysinternals/bb896651

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
Run Code Online (Sandbox Code Playgroud)

在此期间,请查看其他实用程序.它们可以为每个Windows Professional节省大量时间

  • 我猜,这几乎不是"没有任何第三方工具". (11认同)
  • 哦,没错,但它认为家庭不应被视为"第三方". (11认同)
  • 我建议大家下载Mark Russinovich开发的任何东西:)每当我找到一个拯救我生命的工具时,我会一直看到这个名字. (3认同)
  • 好吧,当然,但这仍然是一个额外的下载(或者使用“\\live.sysinternals.com”,如果仍然存在的话)。不过,我完全同意所有 sysinternals 工具都应该默认包含在内。尽管对于许多用途来说,PowerShell 是一个相当值得的替代品。 (2认同)

fri*_*zik 35

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"
Run Code Online (Sandbox Code Playgroud)

仅限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
Run Code Online (Sandbox Code Playgroud)

这应该产生以下结果:

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
Run Code Online (Sandbox Code Playgroud)

  • `0.00 C:\Windows` 我可以针对所有文件夹优化它,已尝试以管理员身份运行 (4认同)
  • 有没有办法同时显示基本文件夹中的所有文件和大小(以 Mb 为单位)?在本例中为“C:\my\Tools\” (2认同)
  • 另外,当有很多文件夹时(例如在C:驱动器中),它会中断 (2认同)

Cus*_*dio 11

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

  • 你可以使用下面的命令`du -h -d 1 folder | sort -h` 如果你想要人类可读的大小,只有一级子目录,并按大小排序。 (6认同)

小智 8

这是我编写的 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
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*iev 7

我建议使用https://github.com/aleksaan/diskusage实用程序.非常简单,乐于助人.并且非常快.

只需输入命令shell即可

diskusage.exe -path 'd:/go; d:/Books'
Run Code Online (Sandbox Code Playgroud)

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

  1.| DIR: d:/go      | SIZE: 325.72 Mb   | DEPTH: 1 
  2.| DIR: d:/Books   | SIZE:  14.01 Mb   | DEPTH: 1 

这个例子在HDD上执行了272ms.

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

diskusage.exe -path 'd:/go; d:/Books' -depth 2
Run Code Online (Sandbox Code Playgroud)

并且不仅为选定的文件夹而且为其子文件夹获取大小

  1.| DIR: d:/go            | SIZE: 325.72 Mb   | DEPTH: 1 
  2.| DIR: d:/go/pkg        | SIZE: 212.88 Mb   | DEPTH: 2 
  3.| DIR: d:/go/src        | SIZE:  62.57 Mb   | DEPTH: 2 
  4.| DIR: d:/go/bin        | SIZE:  30.44 Mb   | DEPTH: 2 
  5.| DIR: d:/Books/Chess   | SIZE:  14.01 Mb   | DEPTH: 2 
  6.| DIR: d:/Books         | SIZE:  14.01 Mb   | DEPTH: 1 
  7.| DIR: d:/go/api        | SIZE:   6.41 Mb   | DEPTH: 2 
  8.| DIR: d:/go/test       | SIZE:   5.11 Mb   | DEPTH: 2 
  9.| DIR: d:/go/doc        | SIZE:   4.00 Mb   | DEPTH: 2 
 10.| DIR: d:/go/misc       | SIZE:   3.82 Mb   | DEPTH: 2 
 11.| DIR: d:/go/lib        | SIZE: 358.25 Kb   | DEPTH: 2 

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