Windows 如何使用批处理获取文件夹的大小(以字节为单位)

Windows 如何使用批处理获取文件夹的大小(以字节为单位),windows,for-loop,batch-file,cmd,directory,awk,Windows,For Loop,Batch File,Cmd,Directory,Awk,如果我检查文件夹的大小,我会得到以下结果: for %i in (*) do @set /a size+=%~zi 166576251665763016658914166589201665917416659428166596821665993616660190166601951666038416660487168652871687269016872716169860941698686116986931169872071698728616987313169875941698775316987908

如果我检查文件夹的大小,我会得到以下结果:

for %i in (*) do @set /a size+=%~zi
166576251665763016658914166589201665917416659428166596821665993616660190166601951666038416660487168652871687269016872716169860941698686116986931169872071698728616987313169875941698775316987908169884331700481717005585170056001700563417005891170059181700605117007696170076961700782617021650170218471702192817022003170220911702211617022141170222091702227017022755170228501702370517023960170242831702453617024848170252511702526817578552175800371758003717580037175800371758003717580037175826531758490317591537175919931759206017592095175921301764998617650665176520351765318217654163176541681772380017723825177251031772519925614095256149392561514625615899256181532599996926105233264957532672798526897833268979242689853526898590268986582689871926898790269001782690062626900643269008432690103926907695269077312690853826909921269100822691020226910240269105802691578626915899269343312693438226935123269842752698438326984697269990372701337927013912270139282701420927014362270144002701448427014572274675622746760127468336275041762753080027530915275319062753190627535850275367832756033527560455275605872756248927562632275846482783706427968251279696822797111327972544279739752797540627976865279782962797972727981158279811582805130228051656
echo %size%
28051656
但是dir命令说大小是
1907481021
字节!出什么事了?我怎样才能买到合适的尺码?我有这个,但我不想要像MB,GB这样的大单位。我想把大小放在一个变量中


谢谢。

您正面临算术溢出。检查

 SET /A s=2147483647+1
环境变量算术是在32位有符号整数上完成的


因此,可以安全求和的数字的最大大小是
2^31-1=2147483647

如果确实需要以字节为单位计数,则需要将数字拆分为多个变量

就像低计数下8位和高计数上8位一样,你可以得到16位,分辨率高达9999T


您只需添加一点数学函数即可处理大数字。

试试这个,它会用
dir
命令读取文件夹大小:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "tokens=3" %%a IN ('dir /a-d /-c') DO (
    SET size=!free!
    SET free=%%a
)
ECHO %size% bytes in %cd%

这适用于欧洲时间格式。对于
AM/PM
格式集
tokens=4

这是Aacini提供的解决方案。

这将返回文件夹及其子目录的总和

@echo off
call :size "c:\folder1" 
call :size "c:\folder2" 
pause
goto :eof
:size
for /f "tokens=3" %%b in ('dir /s "%~1" 2^>nul ^|find " File(s) "') do  set "n=%%b"
for /f "tokens=1-4 delims=," %%c in ("%n%") do (
echo %%c%%d%%e%%f bytes [%n%] in "%~1"
)
存储在文本文件中的一组文件夹的代码:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "file=file"
SET /a allsize=0
for /f %%x in (
'for /f "usebackqdelims=" %%a in (%file%^) do @(
    for /f "tokens=3" %%b in ('dir /a-d /-c "%%~a" ^^^|findstr /BR "[0-9]"'^) do @ECHO(%%b^)'
) do (
    FOR /f %%i IN ('awk "BEGIN {a=%%x+!allsize!; print a}"') DO SET "allsize=%%i"
)
ECHO Size of all folders listet in %file%:
awk "BEGIN {a=%allsize%; printf(\"%%10d %%s\",a,\"bytes\n\")}"
awk "BEGIN {a=%allsize%/1024; printf(\"%%10d %%s\",a,\"KB\n\")}"
awk "BEGIN {a=%allsize%/1024/1024; printf(\"%%10d %%s\",a,\"MB\n\")}"
awk "BEGIN {a=%allsize%/1024/1024/1024; printf(\"%%10.2g %%s\",a,\"GB\n\")}"
例如:

Size of all folders listet in file: 1907481021 bytes 1862774 KB 1819 MB 1.8 GB 文件中列出的所有文件夹的大小: 1907481021字节 1862774 KB 1819 MB 1.8 GB
您是指
+=
而不是
=+
吗?是的,很抱歉,这是一个复制粘贴错误。但是结果还是不对,谢谢你的解释!谢谢你的解释!如何使它与“c:\folder1”和“c:\folder2”一起工作?我总是最后一个文件夹的大小:(是的,我知道了,但是我不能从大小:folder1+大小:folder2,如果大小为gtr 2GB得到总数。我会更新你的答案,也许会提出一个新问题。谢谢!我得到的大小不是“c:\folder1”和“c:\folder2”?我总是得到最后一个文件夹的大小:(请查看LS_dev的答案。对于大于2 GB的计算,您应该在Windows中使用
awk
,或者
Perl
。感谢您的解释!