我正在寻找有关vbscript中递归的一些专家见解。 从在线发现的各种示例中,我创建了以下代码,顺便说一下。
http://technet.microsoft.com/en-us/library/ee198872.aspx
Function GetAllSubFolders(RootFolder, ByRef pSubfoldersList)
Dim fso, SubFolder, root
Set fso = CreateObject("scripting.filesystemobject")
set root = fso.getfolder(RootFolder)
For Each Subfolder in root.SubFolders
If pSubFoldersList = "" Then
pSubFoldersList = Subfolder.Path
Else
pSubFoldersList = pSubFoldersList & "|" & Subfolder.Path
End If
GetAllSubFolders Subfolder, pSubFoldersList
Next
GetAllSubFolders = pSubFoldersList
End Function
我的问题是:在创建递归函数时(使用参数存储以前的结果),这是一个很好的方法吗?
我更喜欢将它放在(自包含)“函数”中,因此该过程返回子子文件夹作为结果。但是大多数发现的例子使用了一个“sub”我总是对“sub”vs“function”感到困惑(我明白当你想要一个需要返回你使用函数的程序时,imho这似乎是本例中的情况) 但我也可以使用“sub”而只是简单的引用输出参数(ByRef pSubfoldersList)
那么什么是最佳实践,或者最好一起使用完全不同的方法? (函数是这个例子,与[shell.exec“cmd / c目录RootFolder / s / b / a:d”]相比也很慢,我想这是递归的副作用,或者说FSO真的是真的慢?)
答案 0 :(得分:1)
在递归函数中传递结果是否是一种好习惯,我真的不知道,你可以通过这种方式和另一种方式来测试它,并比较所花费的时间和内存。没有尝试使用您的版本因为我得到错误“Microsoft VBScript运行时错误:权限被拒绝”如果我从c的根开始:
您的解决方案的真正问题是连接,这需要时间,因为在您的情况下每次都会创建BIG变量。更好的方法是将结果存储在数组中,或者将VBscript存储在字典中。我会发一个例子。
子和函数之间的区别是什么:你是正确的主要区别,结果的返回但是可选的所以我总是使用函数,唯一的缺点是如果你没有将值赋值给a变量,你使用两个以上的参数,你必须使用“调用”。当您使用ByRef的方法时,您还可以在主要全局上下文中定义var,它可能更少封装但更易读,您可以更轻松地重用或调试结果。
速度关注的是:vbscript在文件处理方面非常慢,如果你使用WMI也许你可以加速一点但不多,实际上对于某些操作来说最好是shell并让操作系统处理它。我现在用Ruby编程,大多数这样的工作都可以用一行代码编写,而且速度要快得多。
谈到快速,如果您的唯一目的是获得文件列表,了解工具“搜索所有内容”,在不到一秒的时间内您可以搜索数百万个文件,如果您不知道检查它出来了!
以下是使用字典
的示例set fso = CreateObject("Scripting.FileSystemObject")
set filelist = CreateObject("Scripting.Dictionary")
iCount = 0
ShowSubfolders fso.GetFolder("C:\Documents and Settings\peter")
PrintFilelist(filelist)
'--- ---
Function ShowSubFolders(Folder)
For Each Subfolder in Folder.SubFolders
on error resume next
wscript.echo Subfolder.Path 'show some progress
Set fFolder = fso.GetFolder(Subfolder.Path)
if err.number <> 0 then wscript.echo err.description
For Each File in fFolder.Files
iCount = iCount+1
filelist.add iCount, File.Path
Next
ShowSubFolders Subfolder
Next
End Function
'--- ---'
Function PrintFilelist(ByRef dic)
Dim index, allKeys, allItems, msg
allKeys = dic.Keys
' allKeys is an array to all the keys
allItems = dic.Items
' allItems is an array to all the items
wscript.echo "There are " & dic.Count & " number of files in the dictionary"
For index = 0 To dic.Count-1
' Notice, dictionary range goes from 0 to count-1
wscript.echo "Key=" & allKeys(index) & " Filename=" & allItems(index)
Next
End Function