批处理之家's Archiver

CrLf 发表于 2013-8-4 17:56

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

[i=s] 本帖最后由 CrLf 于 2013-8-4 18:01 编辑 [/i]

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

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

getSize(path) '调用过程

'函数 & 过程
Sub getSize(ByVal path)
        On Error Resume Next '忽略错误
        Dim fso
        Set fso = WScript.CreateObject("Scripting.Filesystemobject")
       
        For Each subFolder In fso.GetFolder(path).SubFolders
                WScript.Echo subfolder.Size&" "  & subfolder '
                If Mode_SubFolders Then getSize(subFolder) '为子目录调用过程
        Next
End Sub[/code]调用方法:[code]cscript getFoldersSize.vbs d:
::获取 D:\ 路径下的所有目录大小,不含子目录
cscript getFoldersSize.vbs /s
::获取当前工作路径下的所有子目录大小
cscript getFoldersSize.vbs /s c:\windows
::获取 c:\windows 路径下的所有子目录大小[/code]

523066680 发表于 2013-8-4 23:02

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

CrLf 发表于 2013-8-5 01:18

[i=s] 本帖最后由 CrLf 于 2013-8-5 02:12 编辑 [/i]

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

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

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

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

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

Function getFileSize(ByVal path)
    On Error Resume Next '忽略错误
   
    For Each file In fso.GetFolder(path).Files
        getFileSize = getFileSize + file.Size '获取子文件体积总和
    Next
End Function[/code]用法是[code]cscript /nologo getFoldersSize.vbs d:[/code]试了下很惊奇地发现这个居然没有顶楼 getfolder.size 的方案快

freesoft00 发表于 2015-5-27 21:10

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=135587&ptid=25682]1#[/url] [i]CrLf[/i] [/b]


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

CrLf 发表于 2018-7-11 11:48

[i=s] 本帖最后由 CrLf 于 2018-7-11 12:39 编辑 [/i]

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

var arg = WScript.Arguments



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

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


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

if(arg.Unnamed.Count){
  var strFoler = arg.Unnamed(0)
  
  strPath = strFoler.replace(/[^\\\/:]+$/,'') || '.'
  
  rePattern.compile(
        '^'
        +strFoler
          .replace(/.*[\\\/:\|"'\<\>]/g,'')
          .replace(/\W/g,'\\$&')
          .replace(/\\\*/g,'.*')
          .replace(/\\\?/g,'.')
        +'$'
        ,'im'
      )
}

getFolderSize(strPath, rePattern, option)



function getFolderSize(strPath, rePattern, option){
      
        var fso = WScript.CreateObject("Scripting.Filesystemobject")
  
  var objFolder = fso.GetFolder(strPath);
  var objSubFolders = new Enumerator(objFolder.SubFolders);
  
  for (; !objSubFolders.atEnd(); objSubFolders.moveNext()) {
    var fc = objSubFolders.item()
    try{
      if(fc.Name.search(rePattern)>-1){
        var size = ('            '+fc.Size).replace(/.*(.{12})$/,'$1')
        var name = option.SubFolders ? fc.Path + '\\' + fc.Name : fc.Name
        WSH.Echo(size+'    '+name);
      }
      if(option.SubFolders)getSubFolderSize(fc, rePattern, option)
    }
    catch(E){
      WSH.StdErr.WriteLine('Error:'+E.message+' - '+fc.Name);
    }
  }
}

function getSubFolderSize(objFolder, rePattern, option){
  var objSubFolders = new Enumerator(objFolder.SubFolders);
  var arrEcho = []
  for (; !objSubFolders.atEnd(); objSubFolders.moveNext()) {
    var fc = objSubFolders.item()
    try{
      if(fc.Name.search(rePattern)>-1){
        var size = ('            '+fc.Size).replace(/.*(.{12})$/,'$1')
        var name = fc.Path + '\\' + fc.Name
        WSH.Echo(size+'    '+name);
      }
    }
    catch(E){
      WSH.StdErr.WriteLine('Error:'+E.message+' - '+fc.Name);
    }
   
    getSubFolderSize(fc, rePattern, option)
  }
}[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.