VBS script find and delete file

vbscript

I am trying to find a specific file on computer and delete it.

This is my code:

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 

The code is working only partially. When the file "date.vbs" is in root folder (C:\date.vbs) then it is deleted but when it is in folder (C:\backup\date.vbs) then it will not be deleted. Do you know which code changes I should make to be able to delete file even when it is not in root but anywhere in computer?

Thank you! V.

UPDATE:

The code is pretty much working right now. I just have a final problem of deleting the file. I am able to change the attributes from Read-only to normal but still i get the error of access denied.

This is my code:

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

Thank you for help!

Code I use to run the script as ADMIN. After this it started to show the MessageBoxes. Before it was running in a console.

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

So I believe there is something wrong in this code.

Best Solution

Your approach is much too complicated. Use a simple recursive function:

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

To achieve case-insensitive file name comparison, you could use

If StrComp(oFile.Name, sFileName, vbTextCompare) = 0 Then
Related Question