1

这与 Microsoft System Center Configuration Manager 2007 有点相关,但实际上与 VBScript、FileSystemObject API 和读取子文件夹属性有关。

我正在尝试运行一个脚本来枚举我们的一个分发点(包共享下的每个文件夹)上的文件夹和文件夹大小。我正在使用带有 VBscript 的 FileSystemObject API,我可以抓取大约 60% 的子文件夹,并获取它们的名称和大小,但其余的返回“错误 70 / Permission Denied”。我以什么帐户执行脚本并不重要,我尝试在每个子文件夹对象引用之间添加一个 Sleep() 延迟。它仍然不会得到他们所有。

如果我手动浏览这些文件夹,我可以毫无问题地查看它们的属性。这是 FSO 还是 Windows 脚本主机的已知问题?我在下面附上了脚本代码。蒂亚!

'****************************************************************
' 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
4

3 回答 3

1

是的,这是一个已知问题,在存在安全问题的文件夹(例如您的 c:\windows 文件夹)上,当您在文件夹上使用 .count of .size 时会出现错误。而是枚举每个文件并将计数和大小相加。

于 2013-02-10T20:08:07.400 回答
1

尝试从共享中获取每个 UserProfile 的配置文件大小时,我遇到了同样的问题。我使用 excel 并循环使用我知道在共享中有个人资料的用户名的行,如下所示:

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

当我将共享映射到驱动器号时,只有数千个文件夹中的一些给出了“找不到路径”:

objP = "Z:\" & strUserName '& "\UPM_Profile"
于 2016-07-08T23:06:40.483 回答
0

我在这个主题中发现了一个有趣但可重现的行为。至少在我们的生产环境中:如果我将根路径指定为根隐藏共享(即“\SERVER\Share$”),它就会真正陷入困境。但是,如果我更深一层,例如“\SERVER\Share$\Apps”),它似乎运行得更好。我还修改了脚本以先打印子文件夹名称,然后查询 .Size 属性,这似乎指向性能瓶颈。请注意下面更新示例中语句顺序的变化......

    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
于 2013-04-25T16:54:41.667 回答