要递归遍历vbscript中文件夹中的子文件夹?

时间:2013-06-26 08:03:52

标签: recursion vbscript filesystemobject

我写了以下子程序:

Sub Openf(fldr,fso,ByRef newf)
  Dim subf,fpath,ext,fname,IsDone
  Set subf=fldr.SubFolders
  If(Not subf Is Nothing) Then
    For Each sf in subf
      fpath=fso.GetAbsolutePathName(sf.Path)
      fname=fso.GetBaseName(fpath)
      If(StrComp(fname,"mm")=0) Then
        IsDone=Delfldr(sf.SubFolders,fso,newf)
      End If
      Openf sf,fso,newf
    Next
  Else
    Set subf=fldr.Files
    For Each sf in subf
      fpath=fso.GetAbsolutePathName(sf.Path)
      ext=CStr(fso.GetExtensionName(fpath))
      If(StrComp(ext,"tar.gz")=0) Then
        Delfile subf,fso,newf
      End If
    Next
  End If
End Sub

它应该递归遍历给定文件夹中的所有子文件夹,并在找不到更多子文件夹时停止。在该级别,它必须获取将存在的文件集合(扩展名为tar.gz),然后调用Delfile子例程。还有一个条件是必须直接删除mm文件夹中的子文件夹(使用Delfldr函数)而不进入可以找到文件的级别。

问题是只有mm文件夹中的文件夹被删除。该脚本似乎没有通过与mm文件夹处于同一级别的其他子文件夹。换句话说,tar.gz扩展名的文件不会被删除。

层次结构如下:

C:\backups → c6,mm → es → at01 → files with tar.gz extension

此外,VBScript中是否有等效的return()语句?我最初认为问题是因为在Delfldr子例程执行后控件没有返回到调用语句。所以我把它改成了一个函数并将一个bool值返回给IsDone,认为它会将控制权返回给Openf子程序。然而,这不起作用。

1 个答案:

答案 0 :(得分:1)

我发现您的程序有两个问题:

  1. SubFolders始终是Folders集合,因此sf永远不会是Nothing,您的代码永远不会进入Else分支(因此从不处理任何文件)。改变你的状况

    Not subf Is Nothing
    

    fldr.SubFolders.Count > 0
    
  2. GetExtenstionName()只返回一个扩展名,因此GetExtensionName("file.tar.gz")将生成gz,而不是tar.gz,因此即使您的代码输入了Else分支(它没有)它仍然不会删除任何文件。你需要这样的东西从文件名中提取双扩展名:

    ext = fso.GetExtensionName(fso.GetBaseName(fname)) & "." _
            & fso.GetExtensionName(fname)
    

    顺便说一句,这里你不需要CStr(),因为GetExtensionName()已经返回一个字符串。

  3. 至于你关于return()的问题:你的意思是“等同”?如果您希望过程/函数返回给调用者,则可以分别通过Exit SubExit Function执行此操作。如果要将值返回给调用者,可以通过将值赋给函数名来实现:

    Function Foo()
      Foo = "bar"
    End Function
    

    请注意,后者仅适用于函数,而不适用于过程。此外,赋值可以在函数体中的任何位置进行,也不必在最后。

    更一般地说,我不会使用StrComp()进行字符串比较,除非你真的想要利用它所做的三态比较(更少/相等/更大)。更好(如“更好的可读性”)将是这样的简单比较:

    If LCase(ext) = "tar.gz" Then