[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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. For Each subFolder In fso.GetFolder(path).SubFolders
  15. WScript.Echo subfolder.Size&" "  & subfolder '
  16. If Mode_SubFolders Then getSize(subFolder) '为子目录调用过程
  17. Next
  18. 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 路径下的所有子目录大小
复制代码
2

评分人数

本帖最后由 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. }
复制代码

TOP

回复 1# CrLf


    win7 64位我测试出现无法找到脚本文件“F:\33.vbs”的错误提示。
我把vbs脚本改为了33.vbs

TOP

本帖最后由 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 的方案快

TOP

楼主有空的话增加个可选参数 - 以MB为单位显示大小
到时候拿来用

TOP

返回列表