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

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

我想要的结果和你右键点击文件资源管理器→属性中的文件夹得到的结果一样。

705183 次浏览

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

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

但是,这有几个问题,因为 cmd仅限于32位有符号整数算法。所以它的大小会超过2GiB 错误 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 库,它至少可以正确地添加任意精度的整数。我想我真的应该把它释放出来: -)

我建议在这个链接上从微软提供的系统内部组件中下载实用程序 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

同时,看看其他的工具,它们是每个 Windows 专业人员的救命稻草

我认为你唯一的选择将是 diruse (一个高度支持的第三方解决方案) :

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

不幸的是,Windows CLI 限制相当严格,您可以选择安装 Cygwin,这是一个梦想使用比 cmd。这将使您能够访问移植的 Unix 工具 du,它是在 Windows 上的 diruse 的基础。

对不起,我不能直接回答你的问题用一个命令,你可以运行在本地 cli。

这段代码已经测试过了,您可以再次检查它。

@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

如果你已经在你的电脑上安装了 git (越来越常见) ,只要打开 MINGW32并输入: du folder

获得总大小的最简单方法是 powershell,但是仍然受到总大小中不包含超过260个字符的路径名的限制

我得到了我的 git 发行版 du.exe。另一个地方可能是前面提到的微软或 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%"

Something

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

我解决了类似的问题。这个页面中的一些方法比较慢,一些方法在多语言环境中存在问题(所有方法都假设为英语)。 我在 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))

当然,你也可以改变最后一行,直接显示结果,例如: 环境变量。

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

您可以使用它作为子例程或作为独立的 cmd。

有一个 内置的视窗工具来解决这个问题:

dir /s 'FolderName'

这将打印大量不必要的信息,但最终将是文件夹大小如下:

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

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

: : 获取 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%

因为它不使用单词搜索,它不会有语言问题。

限制:

  • 只对小于2GB 的文件夹有效(cmd 不处理超过32位的数字)
  • 不读取内部文件夹的字节数。

试试:

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 的文件夹

它确实会写到屏幕上,所以如果您不希望这样,就必须使用临时文件。

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

蝙蝠脚本:

@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%

用法:

Bat c: temp

产出:

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

线条:

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

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

只需输入一个命令 shell

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

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

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

这个例子是在硬盘上的 272毫米上执行的。

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

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

并获取所选文件夹及其子文件夹的大小

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.5 Tb 已被扫描为3m12s * *

下面是我为所有工作目录下的文件夹编写的一个 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
}

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

@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方法还可以打印文件夹的内容(在上面的例子中有注释)

因此,这里有一个解决方案,可以按照您最初要求的方式解决两个请求。 它将提供人类可读性文件大小没有文件大小限制每个人都经历。与 Win Vista 或更新版本兼容。只有安装了 Robocopy 才能使用 XP。只需在这个批处理文件中放置一个文件夹,或者使用下面提到的更好的方法。

@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


下列一行程序可用于确定文件夹的大小。

帖子是 GithubActions 格式的,指示使用哪种 shell 类型。

shell: pwsh
run: |
Get-ChildItem -Path C:\temp -Recurse | Measure-Object -Sum Length




shell: cmd
run: |
powershell -noprofile -command "'{0:N0}' -f (ls C:\temp -r | measure -s Length).Sum"

打开 Windows CMD 并运行 follow 命令

dir /s c:\windows

最好使用 du,因为它简单且一致。

安装勺子: iwr -useb get.scoop.sh | iex

安装 busybox: scoop install busybox

目录大小: du -d 0 . -h

今天早些时候我在这个页面,4/27/22,在通过 SysInternals (https://learn.microsoft.com/en-us/sysinternals/downloads/du)和管道输出等等尝试了 DU 之后。我说“我不是用 VBscript 做的吗?”?我得到了这个工作的 ISOroot 文件夹和所有子文件夹的总大小。将文件夹完整路径替换为您自己的。非常快。

GetFolderSize. vbs

 Dim fs, f, s
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder("C:\XPE\Custom\x64\IsoRoot")
s = UCase(f.Name) & " uses " & f.size & " bytes."
MsgBox s, 0, "Folder Size Info"


s=  FormatNumber(f.size/1024000,2) & " MB"
MsgBox s, 0, "Folder Size Info"


s=  FormatNumber(f.size/1073741824,2) & " GB"
MsgBox s, 0, "Folder Size Info"