我正在寻找一些关于vbscript中递归的专家洞察力。从网上找到的各种例子中,我创建了下面的代码,顺便说一句,它可以工作。
函数GetAllSubFolders(RootFolder,ByRef pSubfoldersList) Dim,SubFolder,根集fso = CreateObject("scripting.filesystemobject")为root.SubFolders中的每个子文件夹设置root = fso.getfolder(RootFolder),如果pSubFoldersList =“则pSubFoldersList = Subfolder.Path ByRef= pSubFoldersList &”& Subfolder.Path End If GetAllSubFolders子文件夹,pSubFoldersList Next pSubFoldersList = End函数en21#
我的问题是:在创建递归函数(使用参数存储以前的结果)方面,这是一个很好的方法吗?
我更喜欢把它放在(自带的)“函数”中,因此过程返回子文件夹作为结果。但是,大多数使用"sub“的示例,当涉及到"sub”vs " function“时,我总是感到困惑(我理解当您想要一个需要返回某个函数的过程时,imho -这个例子中的情况就是这样)--但我也可以使用"sub”,只需简单地引用输出参数(ByRef pSubfoldersList)。
那么,什么是最好的实践,还是最好在一起使用一种完全不同的方法?(函数是这个例子与shell.exec "cmd /c dir RootFolder /s /b /a:d“相比也非常慢,我猜这是递归的副作用,或者FSO真的很慢?)
发布于 2012-04-21 18:18:17
在递归函数中传递结果是否是一个很好的实践,我真的不知道,您可以通过这样做和另一种方法来测试这个结果,并比较所花费的时间和内存。在您的版本中还没有尝试过这一点,因为如果我从c#的根开始,就会得到错误"Microsoft VBScript运行时错误:拒绝权限“:
解决方案的真正问题是连接,这需要时间,因为在您的情况下,每次都会创建大变量。最好将结果存储在数组中,或者在字典中存储VBscript的情况。我会发个例子。
子函数和函数之间的区别是什么:关于主要差异,返回结果是正确的,但这是可选的,所以我总是使用函数,唯一的缺点是,如果不将值赋值给一个变量,并且使用了两个以上的参数,就必须使用“调用”。当您在ByRef中使用您的方法时,您还可以在主全局上下文中定义var,它可能封装得较少,但更易读,而且您可以更容易地重用或调试结果。
速度问题: vbscript在文件处理方面非常缓慢,如果您使用WMI,也许您可以加快一些但不太快,实际上对于某些操作来说,最好是执行并让操作系统来处理它。我现在用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 Functionhttps://stackoverflow.com/questions/10259170
复制相似问题