2013-02-10 28 views
1

這與Microsoft System Center Configuration Manager 2007有點相關,但它確實涉及VBScript,FileSystemObject API和讀取子文件夾屬性的問題。使用VBscript枚舉子文件夾屬性

我想運行一個腳本來枚舉我們的其中一個分發點(包共享下的每個文件夾)上的文件夾和文件夾大小。我使用FileSystemObject API和VBscript,我可以抓取大約60%的子文件夾,並獲取它們的名稱和大小,但其餘的則返回「錯誤70 /權限被拒絕」。無論我執行腳本的帳戶如何,我都嘗試在每個子文件夾對象引用之間添加一個Sleep()延遲。它仍然不會讓他們全部。

如果我手動探索文件夾,我可以查看他們的屬性沒有任何問題。這是FSO還是Windows Scripting Host的已知問題?我附上了下面的腳本代碼。 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

不知何故,我懷疑,上面是你正在運行的實際代碼,因爲'上的錯誤恢復Next'將使腳本靜默失敗沒有任何錯誤信息。 – 2013-02-10 17:53:31

回答

1

是的,這是一個已知的問題,對安全問題的文件夾(例如像你的c:\ windows文件夾)當您在文件夾中使用.size的.Count中你會得到錯誤。而是枚舉每個文件並計算總數和大小。

0

我發現一個有趣的,但可重現的行爲與這個話題。至少在我們的生產環境中:如果我將根路徑指定爲根隱藏共享(即「\ SERVER \ Share $」),那麼它真的陷入了困境。但如果我深入一層,比如「\ SERVER \ Share $ \ Apps」),它似乎運行得更好。我還修改了腳本以首先打印子文件夾名稱,然後THEN查詢.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 
+1

vbscript在枚舉網絡文件夾時速度非常慢,請在這裏看到我的問題與一些語言的示例,例如vbscript http://stackoverflow.com/questions/13138160/benchmarks-does-python-have-a-faster-way-of-walking -a網絡文件夾 – peter 2013-04-25 20:20:35

1

我想從一個共享中的每個用戶配置的配置文件的大小時有同樣的問題。我用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"