首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBS脚本查找和删除文件

VBS脚本查找和删除文件
EN

Stack Overflow用户
提问于 2012-01-31 19:53:21
回答 2查看 57.8K关注 0票数 4

我正在尝试找到计算机上的某个特定文件并将其删除。

这是我的代码:

代码语言:javascript
复制
Const DeleteReadOnly = True 

Set oFSO = CreateObject("Scripting.FileSystemObject") 
Set oWshShell = CreateObject("WScript.Shell") 
sDir = oWshShell.ExpandEnvironmentStrings("%temp%\dir.txt") 
sFileName = "\date.vbs" 

If oFSO.FileExists(sDir) Then oFSO.DeleteFile(sDir) 

For Each oDrive In oFSO.Drives 
if oDrive.DriveType = 2 Then Search oDrive.DriveLetter 
Next 

Set oFile = oFSO.OpenTextFile(sDir, 1) 
aNames = Split(oFile.ReadAll, VbCrLf) 
oFile.Close 
For Each sName In aNames 
If InStr(1, sName, sFileName, 1) > 0 Then WScript.Echo sName 
Next 

dim filesys 
Set filesys = CreateObject("Scripting.FileSystemObject") 
filesys.CreateTextFile "\date.vbs", True 
If filesys.FileExists("\date.vbs") Then 
filesys.DeleteFile "\date.vbs" 
Wscript.Echo("File deleted") 
End If 


Sub Search(sDrive) 
WScript.Echo "Scanning drive " & sDrive & ":" 
oWshShell.Run "cmd /c dir /s /b " & sDrive & ":\" & sName & " >>" & sDir, 0, True 
End Sub 

代码只能部分工作。当文件"date.vbs“在根文件夹(C:\date.vbs)中时,它将被删除,但当它在文件夹(C:\backup\date.vbs)中时,它将不会被删除。你知道我应该做哪些代码更改才能删除文件,即使它不在根目录中,而是在计算机中的任何位置?

谢谢!V。

更新:

代码现在可以正常工作了。我只有最后一个删除文件的问题。我可以将属性从只读更改为普通,但仍然收到拒绝访问的错误。

这是我的代码:

代码语言:javascript
复制
Const DeleteReadOnly = True 
Dim oFSO, oDrive, sFileName, ws, WshS, fso, usrProfile, oFolder, skypefolder

Set oFSO   = CreateObject("Scripting.FileSystemObject") 
sFileName  = "Skype.exe"

Set WshS = WScript.CreateObject("WScript.Shell")
usrProfile = WshS.ExpandEnvironmentStrings("%UserProfile%")
skypefolder = "C:\Program Files (x86)\Skype\"

For Each oDrive In oFSO.Drives 
  If oDrive.DriveType = 2 Then Recurse oFSO.GetFolder(skypefolder)
Next 

Sub Recurse(oFolder)
  Set oFile   = CreateObject("Scripting.FileSystemObject") 
  Dim oSubFolder, oFile

  If IsAccessible(oFolder) Then
    For Each oSubFolder In oFolder.SubFolders
     Recurse oSubFolder
    Next 
    WScript.Echo oFolder.Path

    For Each oFile In oFolder.Files
      If oFile.Name = sFileName And oFile.Attributes And 1 Then
        oFile.Attributes = 0
        oFile.Delete True

      End If
      Next 
  End If
End Sub

Function IsAccessible(oFolder)
  On Error Resume Next
  IsAccessible = oFolder.SubFolders.Count >= 0
End Function

感谢您的帮助!

我用来以管理员身份运行脚本的代码。之后,它开始显示MessageBoxes。在控制台中运行之前。

代码语言:javascript
复制
If WScript.Arguments.Named.Exists("elevated") = False Then

    CreateObject("Shell.Application").ShellExecute "wscript.exe", """" &     WScript.ScriptFullName & """ /elevated", "", "runas", 1
    WScript.Quit
Else

    Set oShell = CreateObject("WScript.Shell")
    oShell.CurrentDirectory =     CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
    'WScript.Echo("Now running with elevated permissions")

End If

因此,我认为这段代码中存在错误。

EN

回答 2

Stack Overflow用户

发布于 2012-01-31 20:11:41

你的方法太复杂了。使用一个简单的递归函数:

代码语言:javascript
复制
Option Explicit

Const DeleteReadOnly = True 
Dim oFSO, oDrive, sFileName

Set oFSO   = CreateObject("Scripting.FileSystemObject") 
sFileName  = "date.vbs"

For Each oDrive In oFSO.Drives 
  If oDrive.DriveType = 2 Then Recurse oDrive.RootFolder
Next 

Sub Recurse(oFolder)
  Dim oSubFolder, oFile

  If IsAccessible(oFolder) Then
    For Each oSubFolder In oFolder.SubFolders
     Recurse oSubFolder
    Next 

    For Each oFile In oFolder.Files
      If oFile.Name = sFileName Then
        'oFile.Delete ' or whatever
      End If
    Next 
  End If
End Sub

Function IsAccessible(oFolder)
  On Error Resume Next
  IsAccessible = oFolder.SubFolders.Count >= 0
End Function

要实现不区分大小写的文件名比较,您可以使用

代码语言:javascript
复制
If StrComp(oFile.Name, sFileName, vbTextCompare) = 0 Then
票数 4
EN

Stack Overflow用户

发布于 2012-01-31 20:42:06

作为练习:您还可以使用WMI服务查找某些文件。您不必遍历所有文件夹,您只需查询任何驱动器、任何文件夹上的文件:

代码语言:javascript
复制
Function find_file(filename)

    Dim objWMIService, colItems, objItem, strComputer
    strComputer = "."

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile WHERE FileName='" & filename & "'",,48)

    For Each objItem in colItems
        msgbox "Found " & objItem.Name & " in " objItem.Path
    Next

End Function

注意:函数可能需要很长时间才能返回结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9079086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档