开发者

VBScript Catching Erroring Varialble Value

I have a VB Script (.vbs file) that is just a simple directory listing of a drive. It will the base of a drive back up scri开发者_StackOverflow中文版pt. But when running it as it is below, I am getting a Permission Denied error on some folder. What I need to find is what that folder is so I can figure out what the problem is with the folder.

The line that is giving the error is "For Each TempFolder In MoreFolders". So what I am trying to figure out is how to WScript.Echo the current path (objDirectory) if there is an error.

I am not sure if it matters much, but just in case, the error that I am getting is Permission Denied 800A0046 on line 12. So some folder, I do not know which one, is not letting me look inside.

  Set WSShell = WScript.CreateObject("WScript.Shell")
  Set objFSO = CreateObject ("Scripting.FileSystemObject")

  Dim FolderArr()
  FolderCount = 0

  TopCopyFrom = "G:\"

  Sub WorkWithSubFolders(objDirectory)
    Set MoreFolders = objDirectory.SubFolders
    'The next line is where the error occurs (line 12)
    For Each TempFolder In MoreFolders
        FolderCount = FolderCount + 1
        ReDim Preserve FolderArr(FolderCount)
        FolderArr(FolderCount) = TempFolder.Path
       ' WScript.Echo TempFolder.Path
       WorkWithSubFolders(TempFolder)
    Next
  End Sub

  ReDim Preserve FolderArr(FolderCount)
  FolderArr(FolderCount) = TopCopyFrom

  Set objDirectory = objFSO.GetFolder(TopCopyFrom)
      WorkWithSubFolders(objDirectory)
  Set objDirectory = Nothing

  WScript.Echo "FolderCount = " & FolderCount
  WScript.Sleep 30000

  Set objFSO = Nothing
  Set WSShell = Nothing


Try adding the On Error Resume Next statement before the For Each loop and checking the Err.Number property after the problematic line, like this:

Sub WorkWithSubFolders(objDirectory)
  On Error Resume Next
  Set MoreFolders = objDirectory.SubFolders
  For Each TempFolder In MoreFolders
    If Err.Number = 0 Then
      FolderCount = FolderCount + 1
      ReDim Preserve FolderArr(FolderCount)
      FolderArr(FolderCount) = TempFolder.Path
      WorkWithSubFolders(TempFolder)
    Else
      WScript.Echo "Error #" & Err.Number & " " & Err.Description & vbNewLine & _
                   TempFolder.Path
      Err.Clear
    End If
  Next
End Sub


It looks like you are trying to open a folder that is "Protected" in some way.

If the "For Each TempFolder In MoreFolders" failed, then further processing after trapping the error will not allow you to see which folder failed by examining the value of "TempFolder.Path". In fact, accessing "TempFolder.Path" in the error handling code will often cause an unhandled error and the script will crash.

It is a little cleaner to capture the name of the folder and trap the error before you get to the "For Each" loop:

    Option Explicit

    Dim objWSShell
    Dim objFSO
    Dim objDirectory

    Dim FolderCount
    Dim ErrFolderCount
    Dim TopCopyFrom
    Dim FolderArr()

    Dim strDirFullName
    Dim intDummy
    Dim intErrorNumber
    Dim strErrorDescription

     '' Set objWSShell = WScript.CreateObject("WScript.Shell")
        Set objFSO = CreateObject ("Scripting.FileSystemObject")

        FolderCount = 0
        ErrFolderCount = 0

        TopCopyFrom = "C:\"

        ReDim Preserve FolderArr(FolderCount)
        FolderArr(FolderCount) = TopCopyFrom

        WScript.Echo "Processing: " & FolderArr(FolderCount)

        Set objDirectory = objFSO.GetFolder(TopCopyFrom)
        WorkWithSubFolders objDirectory
        Set objDirectory = Nothing

        WScript.Echo "FolderCount = " & FolderCount
        WScript.Sleep 30000

        If (ErrFolderCount > 0) Then
            WScript.Echo "ErrFolderCount = " & ErrFolderCount
        End If

        Set objFSO = Nothing
     '' Set objWSShell = Nothing

        WScript.Quit


    Sub WorkWithSubFolders(objDirectory)

    Dim MoreFolders
    Dim TempFolder

        strDirFullName = objDirectory.Path
     '' WScript.Echo "Processing: " & strDirFullName
        On Error Resume Next
            intDummy = objDirectory.SubFolders.Count
            intErrorNumber = Err.Number
            strErrorDescription = Err.Description
            Err.Clear
        On Error Goto 0
        If (intErrorNumber <> 0) Then
            WScript.Echo "Error #" & intErrorNumber & ",  " & strErrorDescription & ",  Processing folder: " & strDirFullName
            ErrFolderCount = ErrFolderCount + 1
            Exit Sub
        End If
        Set MoreFolders = objDirectory.SubFolders
        For Each TempFolder In MoreFolders
            FolderCount = FolderCount + 1
            ReDim Preserve FolderArr(FolderCount)
            FolderArr(FolderCount) = TempFolder.Path
            WorkWithSubFolders(TempFolder)
        Next
    End Sub

Output:

    Processing: C:\
    Error #70,  Permission denied,  Processing folder: C:\$Recycle.Bin\S-1-5-24-248752723-3714214951-6237883060-500
    Error #70,  Permission denied,  Processing folder: C:\$Recycle.Bin\S-1-5-24-192348782-4665637426-2144812622-1001
    Error #70,  Permission denied,  Processing folder: C:\$Recycle.Bin\S-1-5-24-192348782-4665637426-2144812622-1002
    Error #70,  Permission denied,  Processing folder: C:\$Recycle.Bin\S-1-5-24-192348782-4665637426-2144812622-1003
    Error #70,  Permission denied,  Processing folder: C:\$Recycle.Bin\S-1-5-24-192348782-4665637426-2144812622-500
    Error #70,  Permission denied,  Processing folder: C:\Documents and Settings
    Error #70,  Permission denied,  Processing folder: C:\MSOCache
    Error #70,  Permission denied,  Processing folder: C:\PerfLogs
    Error #70,  Permission denied,  Processing folder: C:\Program Files (x86)\Google\CrashReports
    Error #70,  Permission denied,  Processing folder: C:\Program Files (x86)\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA
    Error #70,  Permission denied,  Processing folder: C:\Program Files (x86)\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\JOBS
    Error #70,  Permission denied,  Processing folder: C:\Program Files (x86)\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log
    ...
    ...
    ...
    Error #70,  Permission denied,  Processing folder: C:\Windows\Prefetch
    Error #70,  Permission denied,  Processing folder: C:\Windows\security\audit
    Error #70,  Permission denied,  Processing folder: C:\Windows\ServiceProfiles\LocalService
    Error #70,  Permission denied,  Processing folder: C:\Windows\ServiceProfiles\NetworkService
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\com\dmp
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\config
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\ias
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\LogFiles\Fax\Incoming
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\LogFiles\Fax\Outgoing
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\LogFiles\Firewall
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\LogFiles\HTTPERR
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\LogFiles\WMI
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\Msdtc
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\NetworkList
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\RsFx
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\spool\PRINTERS
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\Tasks
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\wbem\MOF
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\wdi
    Error #70,  Permission denied,  Processing folder: C:\Windows\System32\wfp
    Error #70,  Permission denied,  Processing folder: C:\Windows\SysWOW64\com\dmp
    Error #70,  Permission denied,  Processing folder: C:\Windows\SysWOW64\config
    Error #70,  Permission denied,  Processing folder: C:\Windows\SysWOW64\Msdtc
    Error #70,  Permission denied,  Processing folder: C:\Windows\SysWOW64\NetworkList
    Error #70,  Permission denied,  Processing folder: C:\Windows\SysWOW64\Tasks
    Error #70,  Permission denied,  Processing folder: C:\Windows\Temp
    FolderCount = 59815
    ErrFolderCount = 1109
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜