在 Windows 中是否可以在不使用任何 3rd 方工具的情况下从命令行获取文件夹的大小?
我想要的结果与右键单击 Windows 资源管理器 → 属性中的文件夹时得到的结果相同。
在 Windows 中是否可以在不使用任何 3rd 方工具的情况下从命令行获取文件夹的大小?
我想要的结果与右键单击 Windows 资源管理器 → 属性中的文件夹时得到的结果相同。
为此有一个内置的 Windows 工具:
dir /s 'FolderName'
这将打印很多不必要的信息,但最终将是文件夹大小,如下所示:
Total Files Listed:
12468 File(s) 182,236,556 bytes
如果您需要包含隐藏文件夹,请添加/a
.
您可以递归地添加大小(以下是批处理文件):
@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 库,它至少获得了任意精度整数加法的权利。我真的应该释放它,我猜 :-)
单线:
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
我建议从 Microsoft 在此链接 http://technet.microsoft.com/en-us/sysinternals/bb896651提供的 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 专业人士的救星
如果您的计算机中安装了 git(越来越常见),只需打开 MINGW32 并输入:du folder
这是我编写的一个 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
}
我建议使用我编写的https://github.com/aleksaan/diskusage实用程序。非常简单而且很有帮助。而且非常快。
只需输入命令外壳
diskusage.exe -path 'd:/go; d:/Books'
并获取按大小排列的文件夹列表
1.| 目录:d:/go | 大小:325.72 Mb | 深度:1 2.| 目录:d:/书籍 | 大小:14.01 Mb | 深度:1
此示例在 HDD 上以272 毫秒执行。
您可以增加要分析的子文件夹的深度,例如:
diskusage.exe -path 'd:/go; d:/Books' -depth 2
并获取所选文件夹及其子文件夹的大小
1.| 目录:d:/go | 大小:325.72 Mb | 深度:1 2.| 目录:d:/go/pkg | 大小:212.88 Mb | 深度:2 3.| 目录:d:/go/src | 大小:62.57 Mb | 深度:2 4.| 目录:d:/go/bin | 大小:30.44 Mb | 深度:2 5.| 目录:d:/书籍/国际象棋 | 大小:14.01 Mb | 深度:2 6.| 目录:d:/书籍 | 大小:14.01 Mb | 深度:1 7.| 目录:d:/go/api | 大小:6.41 Mb | 深度:2 8.| 目录:d:/go/test | 大小:5.11 Mb | 深度:2 9.| 目录:d:/go/doc | 大小:4.00 Mb | 深度:2 10.| 目录:d:/go/misc | 大小:3.82 Mb | 深度:2 11.| 目录:d:/go/lib | 大小:358.25 KB | 深度:2
*** 服务器上的 3.5Tb 已扫描 3 分 12 秒**
尝试:
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 的文件夹
它确实会写入屏幕,因此如果您不想这样做,则必须使用临时文件。
此代码经过测试。你可以再检查一遍。
@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
我想这只有在目录是相当静态的并且它的内容在两个 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
打开 windows CMD 并运行以下命令
dir /s c:\windows
我认为您唯一的选择是 diruse (高度支持的第 3 方解决方案):
不幸的是,Windows CLI 的限制非常严格,您也可以安装Cygwin,与 cmd 相比,它是一个理想的使用方式。这将使您可以访问移植的 Unix 工具 du,它是 Windows 上 diruse 的基础。
抱歉,我无法使用您可以在本机 cli 上运行的命令直接回答您的问题。
我得到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%"
➪</p>
___________
DIRECTORIES
37M Alps-images
12M testfolder
_____
FILES
765K Dobbiaco.jpg
1.0K testfile.txt
_____
TOTAL
58M D:\pictures\sample
::获取 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
最后得到倒数第二行的字节数 - 第 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%
由于它不使用单词搜索,因此不会有语言问题。
限制:
以下脚本可用于获取和累积给定文件夹下每个文件的大小。
文件夹路径%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
还可以打印文件夹的内容(上例中注释)
因此,这是您最初要求的两种请求的解决方案。它将提供人类可读的文件大小,而不会受到每个人都遇到的文件大小限制。兼容 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
以下单行可用于确定文件夹的大小。
该帖子采用 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"
我解决了类似的问题。此页面中的某些方法很慢,而某些方法在多语言环境中存在问题(均假设为英语)。我发现在 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。参数是用引号括起来的测试文件夹的名称。
获得总大小的最简单方法是 powershell,但仍然受到长度超过 260 个字符的路径名不包括在总数中的限制