Enumerating Sub-Folder Properties with VBscript

烂漫一生 提交于 2019-12-11 06:48:32

问题


This is somewhat related to Microsoft System Center Configuration Manager 2007, but it's really about an issue with VBScript, the FileSystemObject API and reading sub-folder properties.

I am trying to run a script to enumerate the folders and folder sizes on one of our Distribution Points (every folder beneath the Package Share). I'm using the FileSystemObject API, with VBscript, I can crawl about 60% of the sub-folders, and get their names and sizes, but then the rest return "error 70 / Permission Denied". It doesn't matter what account I execute the script as, and I've tried adding a Sleep() delay between each sub-folder object reference. It still won't get them all.

If I manually explore the folders, I can view their properties without any problem. Is this a known issue with FSO or maybe Windows Scripting Host? I've attached the script code below. TIA!

'****************************************************************
' Filename..: fso_subfolder_sizes.vbs
' Author....: skatterbrainz
' Date......: 02/10/2013
' Purpose...: enumerate package folders and tally disk space
'****************************************************************
Option Explicit

Const rootFolder = "\\SERVER123\ShareName$"

Dim time1, folderCount, totalSpace
Dim objFSO, objFolder, objSub
Dim GBsize, folderName, folderSIze

time1 = Timer

Set objFSO = CreateObject("Scripting.FileSystemObject")

folderCount = 0
totalSpace = 0

On Error Resume Next
Set objFolder = objFSO.GetFolder(rootFolder)

If err.Number = 0 Then

    wscript.echo "<folders>"

    For each objSub in objFolder.SubFolders

        folderName = objSub.Name
        folderSize = objSub.Size

        GBsize = FormatNumber(Bytes2Gbytes(folderSize), 2) & " GB"

        wscript.echo "<folder name=""" & folderName & """ size=""" & GBsize & """/>"

        folderCount = folderCount + 1
        totalSpace = totalSpace + folderSize

    Next

    Set objFolder = Nothing

    wscript.echo "</folders>"

    wscript.echo "--------------------------"
    wscript.echo "sub-folders: " & folderCount
    wscript.echo "total space: " & FormatNumber(Bytes2GBytes(totalSpace),2) & " GB"
Else
    wscript.echo "root folder not found"
End If

Set objFSO = Nothing

wscript.echo "runtime: " & FormatNumber(Timer - time1, 2) & " Msecs"

Function Bytes2Gbytes(n)
    If n > 0 Then
        Bytes2Gbytes = (n / 1024 / 1024 / 1024)
    Else
        Bytes2Gbytes = 0
    End If
End Function

回答1:


Yes this is a known issue, on folders with security issues (like eg your c:\windows folder) you get errors when you use .count of .size on folder. Instead enumerate each file and sum the count and size.




回答2:


I had the same problem when trying to get profile size of each UserProfile from a share. I used excel and was looping through rows with usernames that I knew had a profile in the share, like this:

strUserName = ActiveCell.Value
objP = "\\SERVER\SHARE$\" & strUserName & "\UPM_Profile"
ActiveCell.Offset(0, 1).Value = (FormatNumber(objFSO.GetFolder(objP).Size, 0, , , 0) / 1024) / 1024

Just some of the thousands folders gave "Path Not Found" It all worked when I instead mapped the Share to a driveletter:

objP = "Z:\" & strUserName '& "\UPM_Profile"



回答3:


I found an interesting, yet reproducible behavior with this topic. At least in our production environment: If I specify the root path as the root hidden share (i.e. "\SERVER\Share$") it gets really bogged down. But if I go one level deeper, such as "\SERVER\Share$\Apps") it seems to run much better. I also modified the script to print the sub-folder name first, and THEN query the .Size property, and that seems to point to the performance bottleneck. Note the change in statement ordering in the updated example below...

    For each objSub in objFolder.SubFolders

    folderName = objSub.Name

    wscript.echo vbTab & "<folder>"
    wscript.echo vbTab & vbTab & "<folderName>" & folderName & "</folderName>"

    folderSize = objSub.Size
    GBsize = FormatNumber(Bytes2Gbytes(folderSize), 2) & " GB"

    wscript.echo vbTab & vbTab & "<folderSize>" & GBsize & "</folderSize>"
    wscript.echo vbTab & "</folder>"

    folderCount = folderCount + 1
    totalSpace = totalSpace + folderSize

Next


来源:https://stackoverflow.com/questions/14800367/enumerating-sub-folder-properties-with-vbscript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!