Скрипт останавливается на защищенных файлах, таких как системные файлы - PullRequest
0 голосов
/ 16 февраля 2010

Этот код останавливается через некоторое время из-за защищенных файлов, таких как системные файлы, «Permission Denied».

Есть ли способ изменить приведенный ниже код, чтобы он мог обрабатывать такие защищенные файлы или обходить их?

Set objFS=CreateObject("Scripting.FileSystemObject") 
WScript.Echo Chr(34) & "Full Path" &_ 
 Chr(34) & ","  & Chr(34) & "File Size" &_ 
 Chr(34) & ","  & Chr(34) & "File Date modified" &_ 
 Chr(34) & "," & Chr(34) & "File Date Created" &_ 
 Chr(34) & "," & Chr(34) & "File Date Accessed" & Chr(34) 
Set objArgs = WScript.Arguments 
strFolder = objArgs(0) 
Set objFolder = objFS.GetFolder(strFolder) 
Go (objFolder) 
Sub Go(objDIR) 
  If objDIR <> "\System Volume Information" Then 
    For Each eFolder in objDIR.SubFolders 
        Go eFolder 
    Next    
  End If 
    For Each strFile In objDIR.Files 
        WScript.Echo Chr(34) & strFile.Path & Chr(34) & "," &_ 
        Chr(34) & strFile.Size & Chr(34) & "," &_ 
        Chr(34) & strFile.DateLastModified & Chr(34) & "," &_ 
        Chr(34) & strFile.DateCreated & Chr(34) & "," &_ 
        Chr(34) & strFile.DateLastAccessed & Chr(34) 
    Next  
End Sub 

Затем вызовите его из командной строки как это.

c:\test> cscript //nologo myscript.vbs "c:\" > "C:\test\Output.csv"

Ответы [ 4 ]

1 голос
/ 31 марта 2010

VBScript допускает перехват ошибок, хотя и не так элегантно, как VBA. Попробуйте скрипт ниже.

On Error Resume Next
    '[ ... code ...  ]
Dim test_result, divisor

 divisor = 1        '' No error
'divisor = 0        '' raise error #11
'divisor = "zero"   '' raise a different error

test_result = 2/divisor

If Err.Number = 11 then  ''This line must appear at the point error is raised
    MsgBox "Handled Error: " & Err.Description
ElseIf Err.Number > 0 then 
    MsgBox "Error: " & Err.Number & "  " & Err.Description
    Err.Clear   ''if you wanted to proceed clean from here
End If

MsgBox "Result: " & test_result
1 голос
/ 30 марта 2010

Я упростил ваш код (на основе вашего дублирующего вопроса) и, не пытаясь обработать ошибки, вижу проблему: objDIR.SubFolders не удается, если одна из подпапок (например, \ System Volume Information) не имеет разрешений быть просмотренным! Вам нужно использовать другой метод для Folder, чтобы перечислить имена foldernames, объединить их с существующим путем и затем перехватить ошибку. GetFolder может возникнуть, когда у вас нет разрешений. (У меня нет времени кодировать это решение в настоящее время.)

Option Explicit

Dim objFS
Dim objArgs
Dim strFolder
Dim objFolder

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
WScript.StdOut.WriteLine """Full Path"",""File Size""," & _
  """File Date modified"",""File Date Created""," & _
  """File Date Accessed"""
Set objArgs = WScript.Arguments
strFolder = objArgs(0)
Set objFolder = objFS.GetFolder(strFolder)
Go objFolder
Sub Go(objDIR)
  Dim strFile
  On Error Resume Next
    For Each eFolder in objDIR.SubFolders
        Go eFolder
    Next
    For Each strFile In objDIR.Files
        WScript.StdOut.WriteLine """" & strFile.Path & """,""" & _
          strFile.Size & """,""" & _
          strFile.DateLastModified & """,""" & _
          strFile.DateCreated & """,""" & _
          strFile.DateLastAccessed & """"
    Next
End Sub
0 голосов
/ 16 февраля 2010

Вы можете игнорировать ошибки скрипта в VBScript, добавив

On Error Resume Next

перед частью кода, в которой вы хотите игнорировать ошибки.

Оператор восстановления поведения по умолчанию -

On Error GoTo 0

И просто замечание: вызовы методов в VB и VBScript не используют скобки, если они отображаются как один оператор.Таким образом, строка Go (objFolder) должна быть заменена на Go objFolder.

0 голосов
/ 16 февраля 2010

убедитесь, что процесс имеет разрешения. см

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...