首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vbscript递归编程技术

vbscript递归编程技术
EN

Stack Overflow用户
提问于 2012-04-21 13:04:26
回答 1查看 11.1K关注 0票数 1

我正在寻找一些关于vbscript中递归的专家洞察力。从网上找到的各种例子中,我创建了下面的代码,顺便说一句,它可以工作。

  • http://saltwetbytes.wordpress.com/2010/05/04/vbscript-grabbing-subfolders-recursively/
  • http://technet.microsoft.com/en-us/library/ee198872.aspx

函数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真的很慢?)

EN

回答 1

Stack Overflow用户

发布于 2012-04-21 18:18:17

在递归函数中传递结果是否是一个很好的实践,我真的不知道,您可以通过这样做和另一种方法来测试这个结果,并比较所花费的时间和内存。在您的版本中还没有尝试过这一点,因为如果我从c#的根开始,就会得到错误"Microsoft VBScript运行时错误:拒绝权限“:

解决方案的真正问题是连接,这需要时间,因为在您的情况下,每次都会创建大变量。最好将结果存储在数组中,或者在字典中存储VBscript的情况。我会发个例子。

子函数和函数之间的区别是什么:关于主要差异,返回结果是正确的,但这是可选的,所以我总是使用函数,唯一的缺点是,如果不将值赋值给一个变量,并且使用了两个以上的参数,就必须使用“调用”。当您在ByRef中使用您的方法时,您还可以在主全局上下文中定义var,它可能封装得较少,但更易读,而且您可以更容易地重用或调试结果。

速度问题: vbscript在文件处理方面非常缓慢,如果您使用WMI,也许您可以加快一些但不太快,实际上对于某些操作来说,最好是执行并让操作系统来处理它。我现在用Ruby编程,在那里,大多数类似的作业都可以用一行代码编写,而且速度要快得多。

说到快,如果你唯一的目的是有一个你的文件列表,了解这个工具“搜索一切”,在不到一秒钟你可以搜索数百万个文件,如果你不知道它检查出来!

下面是一个使用字典的示例

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10259170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档