0

ドライブの単純なディレクトリ リストである VB スクリプト (.vbs ファイル) があります。これは、ドライブ バックアップ スクリプトのベースになります。しかし、以下のように実行すると、一部のフォルダーでアクセス許可が拒否されたというエラーが発生します。私が見つける必要があるのは、そのフォルダーが何であるかです。そのため、フォルダーの何が問題なのかを突き止めることができます。

エラーが発生している行は、「For Each TempFolder In MoreFolders」です。私が理解しようとしているのは、エラーが発生した場合に現在のパス (objDirectory) を WScript.Echo にする方法です。

それが重要かどうかはわかりませんが、念のため、12 行目の Permission Denied 800A0046 というエラーが表示されます。

  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
4

2 に答える 2

1

次のように、ループのOn Error Resume Next前にステートメントを追加し、問題のある行の後にプロパティを確認してみてください。For EachErr.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
于 2010-04-18T08:57:46.247 に答える
0

何らかの方法で「保護」されているフォルダーを開こうとしているようです。

「For Each TempFolder In MoreFolders」が失敗した場合、エラーをトラップした後の処理では、「TempFolder.Path」の値を調べても、失敗したフォルダーを確認できません。実際、エラー処理コードで「TempFolder.Path」にアクセスすると、多くの場合、未処理のエラーが発生し、スクリプトがクラッシュします。

"For Each" ループに入る前に、フォルダーの名前をキャプチャしてエラーをトラップする方が、少しすっきりします。

    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
于 2012-06-28T01:00:06.000 に答える