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

时间:2012-10-10 07:08:14

标签: windows command-line

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

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

19 个答案:

答案 0 :(得分:101)

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

@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 -s Length

如果你想要它更漂亮:

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" }
}

您可以直接从cmd

使用此功能
powershell -noprofile -command "ls -r|measure -s Length"

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

答案 1 :(得分:97)

有一个内置Windows工具

dir /s 'FolderName'

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

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

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

答案 2 :(得分:60)

我建议在此链接下载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

当你在这里时,看看其他实用程序。它们可以为每个Windows Professional提供救生员

答案 3 :(得分:24)

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

答案 4 :(得分:10)

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

答案 5 :(得分:6)

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

只需在命令外壳中键入

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 

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

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

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.5Tb已扫描3立方米

答案 6 :(得分:3)

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

ForeignKey

答案 7 :(得分: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

答案 8 :(得分: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

答案 9 :(得分:1)

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

Get file/directory size from command line

Windows CLI非常受限制,您可以选择安装Cygwin,与cmd相比,这是一个梦想。这将使您可以访问移植的Unix工具du,这是Windows上diruse的基础。

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

答案 10 :(得分:1)

我的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%"

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

答案 11 :(得分:1)

以下单行可用于确定文件夹的大小。

帖子采用 Github Actions 格式,说明使用的 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"

答案 12 :(得分: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!>>FolderFileCountandSize.txt
    REM remove REM from command below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

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

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

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

答案 13 :(得分: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的文件夹

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

答案 14 :(得分: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也可以打印文件夹的内容(在上面的示例中有注释)

答案 15 :(得分:0)

打开 windows CMD 并运行以下命令

dir /s c:\windows

答案 16 :(得分:0)

::获取Dir命令返回的行数(/ -c以消除数字分隔符:。,) [&#34;代币= 3&#34;仅查看Dir中每行的第三列

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

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

set /a line=%i%-1

最后得到倒数第二行的字节数 - 第3列:

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位的数字)
  • 不读取内部文件夹的字节数。

答案 17 :(得分: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))

您可以将其用作子程序或standlone cmd。参数是已在引号中关闭的已测试文件夹的名称。

答案 18 :(得分:-3)

获取总大小的最简单方法是powershell,但仍然受限于总数不超过260个字符的路径名