【问题标题】:VB Script to delete certain files and if files are found copy other files to directoryVB脚本删除某些文件,如果找到文件,则将其他文件复制到目录
【发布时间】:2015-04-24 18:55:53
【问题描述】:

我的硬盘驱动器感染了病毒。该病毒会加密文件,然后要求支付赎金以解密它们。这些文件是 HELP_DECRYPT.HTML、HELP_DECRYPT.PNG、HELP_DECRYPT.TXT 和 HELP_DECRYPT.URL。

驱动器上有数千个受感染的文件。我正在尝试编写一个脚本来遍历驱动器上的所有文件夹,如果它发现任何恶意文件,它将删除它们。然后我想是否从同一目录中的备份驱动器复制文件,即。如果在 I\Folder\ 中找到 if 将从 F\Folder\ 获取文件。

在我的例子中,被感染的驱动器是 Y,备份驱动器是 X。

我对 VBScripts 比较陌生,目前我掌握的内容如下:

    set fso = CreateObject("Scripting.FileSystemObject")
ShowSubFolders FSO.GetFolder("Y:\"), 3

Sub ShowSubFolders(Folder, Depth)
    If Depth > 0 then
        For Each Subfolder in Folder.SubFolders
            'Wscript.Echo Subfolder.Path
    DeleteFiles(subFolder.path)
  On Error Resume Next
            ShowSubFolders Subfolder, Depth -1 

        Next
    End if
End Sub


  'deletes the malicious files and calls the copy function'
Function DeleteFiles(path)
'wscript.echo("in delete method")
  set FSO2 = Createobject("Scripting.FileSystemObject")
  set ofolder = createobject("Scripting.FileSystemObject")
  set ofolder = FSO2.GetFolder(path)

  if FSO2.FileExists("HELP_DECRYPT.URL") Then
    ofolder.DeleteFile("HELP_DECRYPT.PNG")
    ofolder.DeleteFile("HELP_DECRYPT.HTML")
    ofolder.DeleteFile("HELP_DECRYPT.URL")
    ofolder.DeleteFile("HELP_DECRYPT.TXT")      
      wscript.echo("DeletedFiles")
  copyFiles(FSO.GetParentFolder) 
    end if

End Function


  'copies files from the backup'
Function CopyFiles(from)
    dim to1 'where we're copying to
    to1=from 'where we're copying from
    Call Replace (from, "Y:", "X:")
    SET FSO3 = CreateObject("Scripting.FileSystemObject")
    For Each file In from 'not sure about "file"
        FSO3 = file
        Call FSO3.CopyFile (from, to1, true)'copies file and overwrites if already there
    Next
End Function

【问题讨论】:

    标签: windows vbscript


    【解决方案1】:

    这是我会使用的:

    Option Explicit
    
    Dim FSO, badFiles
    Set FSO = CreateObject("Scripting.FileSystemObject")
    badFiles = Array("HELP_DECRYPT.PNG", "HELP_DECRYPT.URL", "HELP_DECRYPT.HTML", "HELP_DECRYPT.TXT")
    
    Walk FSO.GetFolder("Y:\")
    
    Sub Walk(folder)
      Dim subFolder
      For Each subFolder in folder.SubFolders
        DeleteFiles subFolder, badFiles
        RestoreFiles "X:", subFolder
        Walk subFolder
      Next
    End Sub
    
    Sub DeleteFiles(folder, filesToDelete)
      Dim file
      For Each file In filesToDelete
        file = FSO.BuildPath(folder.Path, file)
        If FSO.FileExists(file) Then FSO.DeleteFile file, True
      Next
    End Sub
    
    Sub RestoreFiles(sourceRoot, destinationFolder)
      Dim sourcePath, file
      WScript.Echo "Restoring " & destinationFolder.Path & " ..."
      sourcePath = Replace(destinationFolder.Path, destinationFolder.Drive, sourceRoot)
      If FSO.FolderExists(sourcePath) Then
        For Each file In FSO.GetFolder(sourcePath).Files
          WScript.Echo file.Name
          ' maybe add a DateLastModified check here?
          file.Copy FSO.BuildPath(destinationFolder.Path, file.Name), True
        Next
      Else
        WScript.Echo "Warning! Folder not found: " & sourcePath
      End If
    End Sub
    

    使用 VBScript 的一般提示:

    • 始终使用Option Explicit
    • 避免使用On Error Resume Next,除非在非常非常狭窄的情况下。简单地抑制任何错误绝不是一个好主意。
    • 在命令行中使用cscript.exe 运行类似上述的脚本,这样您就可以看到脚本的Echo 输出,而无需单击数千个消息框。
    • 使用全局 FSO 对象。无需在每个函数中定义一个新函数
    • 尽量通用。看看上面的DeleteFiles() RestoreFiles() 实际上根本不是针对您当前的问题量身定制的。您或许可以在不同的脚本中重复使用这些函数,而无需更改它们。

    【讨论】:

    • 谢谢,效果很好!我使用 continue on error 的原因是因为有一个文件夹阻止了我的(权限错误)。有什么建议可以解决这个问题吗?
    • 是的,在这种情况下,您必须使用On Error Resume Next,但在函数级别使用它,或者更好的是,在语句级别使用它,准确保护可能失败的一个语句。之后直接检查Err.Number(因此您只是传递已知错误)并尽快使用On Error Goto 0 来恢复正常的脚本行为。由于过于宽泛的Resume Next 有效而未被注意到的真正的意外错误是调试的痛苦。仔细检查 VBS 中的错误处理是最重要的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多