我写了以下子程序:
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
子程序。然而,这不起作用。
答案 0 :(得分:1)
我发现您的程序有两个问题:
SubFolders
始终是Folders
集合,因此sf
永远不会是Nothing
,您的代码永远不会进入Else
分支(因此从不处理任何文件)。改变你的状况
Not subf Is Nothing
到
fldr.SubFolders.Count > 0
GetExtenstionName()
只返回一个扩展名,因此GetExtensionName("file.tar.gz")
将生成gz
,而不是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