1

我正在寻找一些关于 vbscript 中递归的专家见解。从网上找到的各种示例中,我创建了以下代码,顺便说一句。

我的问题是:在创建递归函数(使用参数存储先前结果)时,这是一个好的方法吗?

我更喜欢把它放在一个(自包含的)“函数”中,所以该过程返回子子文件夹作为结果。但是发现的大多数示例都使用“sub”,当谈到“sub”与“function”时,我总是感到困惑(我理解当你想要一个需要返回你使用函数的东西的过程时,恕我直言,这似乎是本例中的情况)但我也可以使用“子”并简单地引用输出参数(ByRef pSubfoldersList)

那么最佳实践是什么,或者一起使用完全不同的方法更好?(与[shell.exec“cmd /c dir RootFolder /s /b /a:d”]相比,这个例子的功能也很慢,我想这是递归的副作用,或者FSO真的是减缓?)

4

1 回答 1

1

将结果传递给递归函数是否是一种好习惯,我真的不知道,您可以通过这种方式和其他方式进行测试,并比较所花费的时间和内存。没有用你的版本尝试过这个,因为如果我从 c 的根目录开始,我会收到错误“Microsoft VBScript 运行时错误:权限被拒绝”:

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

sub 和 function 之间的区别是什么:你对主要区别是正确的,返回结果但这是可选的,所以我总是使用函数,唯一的缺点是如果你不将值分配给变量并且你使用超过 2 个参数,您必须使用“调用”。当您将方法与 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 Function
于 2012-04-21T18:18:17.353 回答