找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31587|回复: 4

[原创] [分享] getFoldersSize.vbs 枚举子目录大小

[复制链接]
发表于 2013-8-4 17:56:02 | 显示全部楼层 |阅读模式
本帖最后由 CrLf 于 2013-8-4 18:01 编辑

也来凑热闹,vbs 用 getfolder.size 简单实现枚举目录大小,效率上应该是慢于 vbs 中递归求和的,但不会因为文件夹权限限制而漏算(有碰到过权限不足进不去的情况):
  1. Dim arg,ws '对象
  2. Dim Mode_SubFolders '布尔
  3. Dim path '字符串

  4. Set arg = WScript.Arguments
  5. path = "." '遍历路径默认为当前目录
  6. If arg.Unnamed.Count Then path = arg.Unnamed(0) '获取遍历路径
  7. Mode_SubFolders = arg.Named.Exists("s") '判断是否使用了 /s 开关,不分大小写

  8. getSize(path) '调用过程

  9. '函数 & 过程
  10. Sub getSize(ByVal path)
  11.         On Error Resume Next '忽略错误
  12.         Dim fso
  13.         Set fso = WScript.CreateObject("Scripting.Filesystemobject")
  14.        
  15.         For Each subFolder In fso.GetFolder(path).SubFolders
  16.                 WScript.Echo subfolder.Size&" "  & subfolder '
  17.                 If Mode_SubFolders Then getSize(subFolder) '为子目录调用过程
  18.         Next
  19. End Sub
复制代码
调用方法:
  1. cscript getFoldersSize.vbs d:
  2. ::获取 D:\ 路径下的所有目录大小,不含子目录
  3. cscript getFoldersSize.vbs /s
  4. ::获取当前工作路径下的所有子目录大小
  5. cscript getFoldersSize.vbs /s c:\windows
  6. ::获取 c:\windows 路径下的所有子目录大小
复制代码

评分

参与人数 2PB +12 技术 +1 收起 理由
523066680 + 12 Thanks for share
Batcher + 1 感谢分享

查看全部评分

发表于 2013-8-4 23:02:20 | 显示全部楼层
楼主有空的话增加个可选参数 - 以MB为单位显示大小
到时候拿来用
 楼主| 发表于 2013-8-5 01:18:18 | 显示全部楼层
本帖最后由 CrLf 于 2013-8-5 02:12 编辑

来一个递归求和的方案,求快就不提供开关了:
  1. Dim fso,arg '对象
  2. Dim path '字符串

  3. Set fso = WScript.CreateObject("Scripting.Filesystemobject")
  4. Set arg = WScript.Arguments

  5. path = "." '遍历路径默认为当前目录
  6. If arg.Unnamed.Count Then path = arg.Unnamed(0) '获取遍历路径

  7. WScript.Echo getFolderSize(path) + getFileSize(path) + 0 & " " & fso.GetFolder(path).Path '调用过程

  8. '函数 & 过程
  9. Function getFolderSize(ByVal path)
  10.     On Error Resume Next '忽略错误
  11.     Dim folderSize '定义临时变量
  12.    
  13.     For Each folder In fso.GetFolder(path).SubFolders
  14.         folderSize = getFolderSize(folder) + getFileSize(folder)
  15.         WScript.Echo folderSize + fileSize + 0 & " """ & folder.Path & """" '为子目录调用过程
  16.         getFolderSize = getFolderSize + folderSize '获取子目录体积总和
  17.     Next
  18. End Function

  19. Function getFileSize(ByVal path)
  20.     On Error Resume Next '忽略错误
  21.    
  22.     For Each file In fso.GetFolder(path).Files
  23.         getFileSize = getFileSize + file.Size '获取子文件体积总和
  24.     Next
  25. End Function
复制代码
用法是
  1. cscript /nologo getFoldersSize.vbs d:
复制代码
试了下很惊奇地发现这个居然没有顶楼 getfolder.size 的方案快
发表于 2015-5-27 21:10:02 | 显示全部楼层
回复 1# CrLf


    win7 64位我测试出现无法找到脚本文件“F:\33.vbs”的错误提示。
我把vbs脚本改为了33.vbs
 楼主| 发表于 2018-7-11 11:48:39 | 显示全部楼层
本帖最后由 CrLf 于 2018-7-11 12:39 编辑

正好用到,用 bat+js 重写了一个
  1. 1>1/* :
  2. @cscript /nologo /e:jscript "%~f0" %*
  3. @exit /b
  4. */

  5. var arg = WScript.Arguments



  6. var option = {
  7.   SubFolders: arg.Named.Exists("s"),
  8.   Help: arg.Named.Exists("?")
  9. }

  10. if(option.Help){
  11.   WSH.Echo(
  12.       'getFoldersSize 批量获取文件夹大小 v1.1  by  http://bbs.bathome.net  CrLf\r\n'
  13.     + '\r\n'
  14.     + 'Usage: getFoldersSize  [Path] [/S]\r\n'
  15.     + '\r\n'
  16.     + '         Path  目标文件夹路径或目录名,目录名可包含通配符\r\n'
  17.     + '\r\n'
  18.     + '          /S   遍历子目录\r\n'
  19.   )
  20.   
  21.   WSH.Quit()
  22. }


  23. var strPath = "."
  24. var rePattern =  new RegExp()

  25. if(arg.Unnamed.Count){
  26.   var strFoler = arg.Unnamed(0)
  27.   
  28.   strPath = strFoler.replace(/[^\\\/:]+$/,'') || '.'
  29.   
  30.   rePattern.compile(
  31.         '^'
  32.         +strFoler
  33.           .replace(/.*[\\\/:\|"'\<\>]/g,'')
  34.           .replace(/\W/g,'\\$&')
  35.           .replace(/\\\*/g,'.*')
  36.           .replace(/\\\?/g,'.')
  37.         +'$'
  38.         ,'im'
  39.       )
  40. }

  41. getFolderSize(strPath, rePattern, option)



  42. function getFolderSize(strPath, rePattern, option){
  43.       
  44.         var fso = WScript.CreateObject("Scripting.Filesystemobject")
  45.   
  46.   var objFolder = fso.GetFolder(strPath);
  47.   var objSubFolders = new Enumerator(objFolder.SubFolders);
  48.   
  49.   for (; !objSubFolders.atEnd(); objSubFolders.moveNext()) {
  50.     var fc = objSubFolders.item()
  51.     try{
  52.       if(fc.Name.search(rePattern)>-1){
  53.         var size = ('            '+fc.Size).replace(/.*(.{12})$/,'$1')
  54.         var name = option.SubFolders ? fc.Path + '\\' + fc.Name : fc.Name
  55.         WSH.Echo(size+'    '+name);
  56.       }
  57.       if(option.SubFolders)getSubFolderSize(fc, rePattern, option)
  58.     }
  59.     catch(E){
  60.       WSH.StdErr.WriteLine('Error:'+E.message+' - '+fc.Name);
  61.     }
  62.   }
  63. }

  64. function getSubFolderSize(objFolder, rePattern, option){
  65.   var objSubFolders = new Enumerator(objFolder.SubFolders);
  66.   var arrEcho = []
  67.   for (; !objSubFolders.atEnd(); objSubFolders.moveNext()) {
  68.     var fc = objSubFolders.item()
  69.     try{
  70.       if(fc.Name.search(rePattern)>-1){
  71.         var size = ('            '+fc.Size).replace(/.*(.{12})$/,'$1')
  72.         var name = fc.Path + '\\' + fc.Name
  73.         WSH.Echo(size+'    '+name);
  74.       }
  75.     }
  76.     catch(E){
  77.       WSH.StdErr.WriteLine('Error:'+E.message+' - '+fc.Name);
  78.     }
  79.    
  80.     getSubFolderSize(fc, rePattern, option)
  81.   }
  82. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:01 , Processed in 0.009329 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表