Board logo

标题: [系统相关] 如何利用批处理快速计算文件夹大小? [打印本页]

作者: whylve    时间: 2010-6-18 16:42     标题: 如何利用批处理快速计算文件夹大小?

因为工作中需要计算许多数据的大小,而有一些文件夹比较大,比较繁琐。所以计算文件夹大小花费的时间会比较长。可不可以通过批处理解决这个问题?谢谢!
作者: CUer    时间: 2010-6-18 17:55

  1. du -hs "C:\Testfolder"
复制代码

作者: 随风    时间: 2010-6-18 19:19

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2* delims= " %%a in ('dir/-c "C:\Testfolder"') do (
  3.    set var=!num!
  4.    set num=%%b
  5. )
  6. echo %var%
  7. pause
复制代码

作者: neorobin    时间: 2010-6-18 20:45

  1. @echo off&chcp 437>nul&setlocal enabledelayedexpansion
  2. for /f "delims=" %%l in ('dir "C:\Testfolder" /a-d /s /-c ^| find /i "File"') do (
  3.   for /f "tokens=3 delims= " %%a in ("%%l") do (set size=%%a)
  4. )
  5. set /a "MBsize=(size+1048576/2)/1048576"
  6. echo !MBsize! MB (!size! bytes)
  7. pause
复制代码

作者: 523066680    时间: 2010-6-18 20:48     标题: 回复 3楼 的帖子

我记得 如果目录是多层
dir  得到的是文件夹当前文件所占空间
dir /s 得到的才是整个文件夹所占的空间

并且在有些文件夹上面 点击属性,  所占空间在一直累加,而不是马上显示结果。
===========

=。= 果然被人抢了椅子。
作者: 随风    时间: 2010-6-18 21:20

多谢 If_Exist 的提醒,3楼的忘了子文件夹和隐藏,系统,只读文件了
:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2* delims= " %%a in ('dir /s /ah /ar /aa /as /a /-c "C:\Testfolder"') do (
  3.    set var=!num!
  4.    set num=%%b
  5. )
  6. echo %var%
  7. pause
复制代码

作者: neorobin    时间: 2010-6-18 22:34     标题: 回复 6楼 的帖子

测试于 WINXPSP3,
我觉得只用
  1. dir /s /a
复制代码
就不会漏掉 子文件夹, 隐藏,系统,只读文件了, 也就是说一个 /a 参数就可以 包含 DHSRA 各种属性了
  1. @echo off&chcp 437>nul&setlocal enabledelayedexpansion
  2. for /f "delims=" %%l in ('dir "C:\" /a /s /-c ^| findstr /i "bytes$"') do (
  3.   for /f "tokens=3 delims= " %%a in ("%%l") do (set size=%%a)
  4. )
  5. echo !size! bytes
  6. pause
复制代码

作者: 随风    时间: 2010-6-18 23:31

原帖由 neorobin 于 2010-6-18 22:34 发表
测试于 WINXPSP3,
我觉得只用dir /s /a就不会漏掉 子文件夹, 隐藏,系统,只读文件了, 也就是说一个 /a 参数就可以 包含 DHSRA 各种属性了@echo off&chcp 437>nul&setlocal enabledelayedexpansion
for /f "delims=" ...

真是可以,但我开始怎么测试都不行,真是晕了~~~
是我的cmd短路了还是我短路了 ^_^
作者: gxuan2008    时间: 2010-6-19 00:19

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f  "delims=" %%a in ('dir /b /s /ad') do (
  3.      for /f "delims=" %%b in ('cd %%a ^|dir /s /b /a-d') do (
  4.              set /a m+=%%~zb
  5.      )
  6.      echo "%%a  !m!">>a.txt
  7.      set /a m=0
  8. )  
  9. endlocal
  10. pause
复制代码
我是想通过每个文件下文件大小累加来得到文件夹大小,但上面运行结果怎么实际属性中看到的大小不一样。
请问错在那里?
作者: 随风    时间: 2010-6-19 01:13     标题: 回复 9楼 的帖子

set /a 会受到最大数值的限制 2^32 次方
你的代码中未包括 含属性的文件,而实际大小应该是包含的
cd 应改为 cd/d  否则无法正确cd到所需目录
不过 'cd %%a ^|dir /s /b /a-d' 应该不行吧? 'cd %%a 到%%a目录,但无结果输出,又传递什么給dir呢?


作者: zqz0012005    时间: 2010-6-19 01:21     标题: 回复 9楼 的帖子

可以去了解一下磁盘簇的概念和文件的存储方式。
作者: zqz0012005    时间: 2010-6-19 02:24

我碰到很多电脑上的wmi/wmic都有问题,那就用vbs吧
  1. f = "C:\Testfolder"
  2. set fso = CreateObject("Scripting.FileSystemObject")
  3. size = fso.GetFolder(f).Size
  4. WScript.Echo size
复制代码

作者: whylve    时间: 2010-6-21 12:59

&setlocal enabledelayedexpansion


这句话什么意思啊?
作者: Batcher    时间: 2010-6-21 13:26     标题: 回复 13楼 的帖子

参考教程:批处理中的变量延迟扩展、变量嵌套
http://bbs.bathome.net/thread-2899-1-1.html
作者: whylve    时间: 2010-6-21 17:56

谢谢
学习了....
作者: shuaige100    时间: 2010-6-21 19:47     标题: 回复 12楼 的帖子

我觉得应该搞一个输入文件夹的路径就可以测算它的大小,再弄一个快捷键,太完美了
作者: Batcher    时间: 2010-6-21 20:34     标题: 回复 16楼 的帖子

推荐使用Total Commander:
选中一个文件夹,按空格键即可。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2