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

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

我想要得到与右键单击Windows资源pipe理器中的文件夹时相同的结果。

您可以recursion地添加大小(以下是batch file):

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

但是,这有几个问题,因为cmd限于32位有符号整数运算。 所以它会得到2 GiB以上的大小错误1 。 此外,它可能会多次计算符号链接和连接点,所以它最好是一个上限,而不是真正的大小(尽pipe如此,你将会遇到这个问题)。

另一种方法是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我在batch file中有一个部分完成的bignum库,至less可以得到任意精度的整数加法。 我真的应该释放它,我猜:-)

我build议从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 -nd:\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的救星

有一个内置的Windows工具

 dir /s 'FolderName' 

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

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

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

如果你的电脑上安装了git(越来越普遍),只需打开MINGW32并键入: du folder

此代码已经过testing。 你可以再次检查。

 @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发行版得到了du.exe 。 另一个地方可能是上述的微软或Unxutils 。

一旦你在你的path中得到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 

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

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

Windows命令行是非常严格的限制,你可以select安装Cygwin ,这是一个梦想使用与cmd相比。 这将使您能够访问移植的Unix工具du,这是Windows上diruse的基础。

对不起,我无法直接用您可以在本地cli上运行的命令来回答您的问题。

尝试:

 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(如果在batch file中使用)

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

它确实写入屏幕,所以如果你不需要的话,你将不得不使用临时文件。

最简单的获取总大小的方法是powershell,但仍然受限于事实上超过260个字符的path名不包含在总数中

我解决了类似的问题。 在这个网页中的一些方法是缓慢的,并且在多语言环境中有一些是有问题的(所有这些都假设为英文)。 我发现在cmd中使用vbscript简单的解决方法。 它在W2012R2和W7中进行testing。

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

它设置环境variablesS_。 当然,你可以改变最后一行,直接显示结果给例如

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

你可以使用它作为子程序或独立的cmd。 参数是用引号括起来的testing文件夹的名称。

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

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

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

 set /a line=%i%-1 

最后得到倒数第二行的字节数 – 第三列:

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

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

限制:

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