0

我编写了以下子程序:

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子程序。然而这并没有奏效。

4

1 回答 1

1

我发现您的程序存在 2 个问题:

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

    Not subf Is Nothing
    

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

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

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

至于您的问题return():在什么方面您的意思是“等效”?如果您希望过程/函数返回给调用者,您可以分别通过Exit Sub和执行此操作Exit Function。如果要向调用者返回一个值,可以通过将值分配给函数名来实现:

Function Foo()
  Foo = "bar"
End Function

请注意,后者仅适用于函数,不适用于过程。此外,赋值可以在函数体的任何地方进行,不必在末尾。

在更一般的说明中,我不会使用StrComp()字符串比较,除非你真的想利用它所做的三态比较(更少/等于/更大)。更好(如“更好的可读性”)将是一个简单的比较,如下所示:

If LCase(ext) = "tar.gz" Then
于 2013-06-26T10:00:29.013 回答