1

これは、Microsoft System Center Configuration Manager 2007にいくらか関連していますが、実際には、VBScript、FileSystemObject API、およびサブフォルダープロパティの読み取りに関する問題です。

スクリプトを実行して、配布ポイントの1つ(パッケージ共有の下にあるすべてのフォルダー)のフォルダーとフォルダーサイズを列挙しようとしています。FileSystemObject APIをVBscriptで使用しているので、サブフォルダーの約60%をクロールして名前とサイズを取得できますが、残りは「エラー70/アクセス許可が拒否されました」を返します。スクリプトを実行するアカウントは関係ありません。各サブフォルダーオブジェクト参照の間にSleep()遅延を追加してみました。それでもすべてを取得することはできません。

手動でフォルダを探索すると、問題なくそれらのプロパティを表示できます。これはFSOまたはWindowsScriptingHostの既知の問題ですか?以下にスクリプトコードを添付しました。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
4

3 に答える 3

1

はい、これは既知の問題です。セキュリティの問題があるフォルダ(c:\ windowsフォルダなど)では、フォルダで.countof.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」のように 1 レベル深くすると、はるかにうまく動作するように見えます。また、最初にサブフォルダー名を出力し、次に .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 に答える