2010-04-17 4 views
0

J'ai un script VB (fichier .vbs) qui est juste une liste de répertoires simple d'un lecteur. Ce sera la base d'un lecteur de sauvegarde de script. Mais lorsque vous l'exécutez comme ci-dessous, j'obtiens une erreur Permission Denied sur un dossier. Ce que j'ai besoin de trouver est ce que ce dossier est afin que je puisse comprendre quel est le problème avec le dossier.VBScript Catching Erroring Valeur Varialble

La ligne qui donne l'erreur est "Pour chaque TempFolder dans MoreFolders". Donc ce que j'essaie de comprendre, c'est comment WScript.Echo le chemin actuel (objDirectory) s'il y a une erreur. Je ne suis pas sûr si cela compte beaucoup, mais juste au cas où, l'erreur que je reçois est l'autorisation refusée 800A0046 sur la ligne 12. Donc, un dossier, je ne sais pas lequel, ne me laisse pas regarder à l'intérieur.

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 
+0

Qu'advient-il lorsque vous décommentez la ligne que vous avez là, avec 'TempFolder.Path'? – dmb

Répondre

1

Essayez d'ajouter la déclaration On Error Resume Next avant que la boucle For Each et vérification de la propriété Err.Number après la ligne problématique, comme ceci:

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

On dirait que vous essayez d'ouvrir un dossier qui est « protégé " en quelque sorte. Si le "Pour chaque TempFolder dans MoreFolders" a échoué, un traitement ultérieur après avoir intercepté l'erreur ne vous permettra pas de voir quel dossier a échoué en examinant la valeur de "TempFolder.Path". En fait, l'accès à "TempFolder.Path" dans le code de gestion des erreurs provoquera souvent une erreur non gérée et le script tombera en panne.

Il est un peu plus propre pour capturer le nom du dossier et intercepter l'erreur avant d'arriver à la boucle « Pour chaque »:

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 

Sortie:

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