如何 运行 windows 可执行和删除子文件夹中的文件

How to run windows executable and delete files from sub folders

我需要一个分为两部分的快速脚本。

  1. 运行 一个 windows 可执行文件
  2. 删除文件夹和子文件夹(*.jpg、*.img)中的文件。

以下脚本的第一部分有效(运行 可执行文件)但我卡在了第 2 部分。我得到

Cannot use parentheses when calling a sub

错误与 RecursiveDelete 调用有关。我实际上从另一个 SO 问题中剪切并粘贴了该代码。我用谷歌搜索了这个错误,但还是不明白。

任何人都可以知道如何让这个脚本工作吗?

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\Users\acer\Desktop\CT\process.exe" & Chr(34), 0
Set WshShell = Nothing

Dim PicArray(2)
Dim p

PicArray(1) = "*.jpg"
PicArray(2) = "*.img"

For p = 1 To 2
  RecursiveDelete ("D:\pictures", PicArray(p))
Next p

Private Sub RecursiveDelete(ByVal Path As String, ByVal Filter As String)
  Dim s
  For Each s In System.IO.Directory.GetDirectories(Path)
    try
      RecursiveDelete(s, Filter)
    catch dirEx as exception
      debug.writeline("Cannot Access " & s & " : " & dirEx.message
    end try
  Next

  For Each s In System.IO.Directory.GetFiles(Path, Filter)
    try
      System.IO.File.Delete(s)
    catch ex as exception
      debug.writeline("Cannot delete " & s & " : " & ex.message)
    end try
  Next
End Sub

更新:来自 Hackoo 的修改后的答案非常有效。

Option Explicit
Dim fso,RootFolder, wshShell
set fso = CreateObject("Scripting.FileSystemObject")
RootFolder = "D:\pictures"
Set RootFolder = fso.GetFolder(RootFolder)
Call RecursiveDelete(RootFolder)

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\process.exe" & Chr(34), 0
Set WshShell = Nothing

'*****************************************************************************
Function RecursiveDelete(Folder)
    Dim File,MyFile,Ext,i,SubFolder
    Set Folder = fso.GetFolder(Folder)
    For each File in Folder.Files
    Set MyFile = fso.GetFile(File)
        Ext = Array("iMG","JPG")
        For i = LBound(Ext) To UBound(Ext)
            If LCase(fso.GetExtensionName(File.name)) = LCase(Ext(i)) Then 
                MyFile.Delete()
                Exit For
            end if
        Next
    Next
    For each SubFolder in Folder.SubFolders
        Call RecursiveDelete(SubFolder)
    Next
End Function
'*****************************************************************************

不是将数组项传递给 RecursiveDelete,而是将数组项的内容获取到循环内的一个变量中,然后传递该变量。

代码将与此类似 - 没有机会测试语法。

 For p = 1 To 2
      Dim PicItem 
      PicItem = PicArray(p)
    RecursiveDelete ("D:\pictures", PicItem )
 Next p

这样试试:

Option Explicit
Dim fso,RootFolder
set fso = CreateObject("Scripting.FileSystemObject")
RootFolder = "D:\pictures"
Set RootFolder = fso.GetFolder(RootFolder)
Call RecursiveDelete(RootFolder)
Msgbox "Pictures Cleaned !",vbInformation,"Pictures Cleaned !"
'*****************************************************************************
Function RecursiveDelete(Folder)
    Dim File,MyFile,Ext,i,SubFolder
    Set Folder = fso.GetFolder(Folder)
    For each File in Folder.Files
    Set MyFile = fso.GetFile(File)
        Ext = Array("jpg","img")
        For i = LBound(Ext) To UBound(Ext)
            If LCase(fso.GetExtensionName(File.name)) = LCase(Ext(i)) Then 
                MyFile.Delete()
                Exit For
            end if
        Next
    Next
    For each SubFolder in Folder.SubFolders
        Call RecursiveDelete(SubFolder)
    Next
End Function
'*****************************************************************************