Перехват VBScript с переменным значением - PullRequest
0 голосов
/ 17 апреля 2010

У меня есть VB Script (файл .vbs), который представляет собой простой список каталогов диска. Это будет сценарий резервного копирования диска. Но при его запуске, как показано ниже, я получаю сообщение об ошибке «Отказано в доступе» для некоторой папки. Мне нужно найти, что это за папка, чтобы я мог выяснить, в чем проблема с папкой.

Строка, сообщающая об ошибке: «Для каждого временного хранилища в дополнительных папках». Так что я пытаюсь выяснить, как WScript.Echo текущий путь (objDirectory), если есть ошибка.

Я не уверен, имеет ли это большое значение, но на всякий случай я получаю сообщение об ошибке «Отказано в доступе 800A0046» в строке 12. Поэтому какая-то папка, я не знаю, какая, не позволяет мне заглянуть внутрь. 1005 *

  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

Ответы [ 2 ]

1 голос
/ 18 апреля 2010

Попробуйте добавить оператор On Error Resume Next перед циклом For Each и проверить свойство Err.Number после проблемной строки, например:

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
0 голосов
/ 28 июня 2012

Похоже, вы пытаетесь открыть папку, которая защищена каким-то образом.

Если «For Each TempFolder In MoreFolders» не удался, то дальнейшая обработка после перехвата ошибки не позволит вам увидеть, какая папка завершилась ошибкой, проверив значение «TempFolder.Path». Фактически, доступ к «TempFolder.Path» в коде обработки ошибок часто приводит к необработанной ошибке, и сценарий падает.

Немного чище захватить имя папки и перехватить ошибку, прежде чем вы перейдете к циклу «Для каждого»:

    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

Выход:

    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
...