vbscript递归编程技术

时间:2012-04-21 13:04:27

标签: scripting recursion vbscript

我正在寻找有关vbscript中递归的一些专家见解。 从在线发现的各种示例中,我创建了以下代码,顺便说一下。

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

我更喜欢将它放在(自包含)“函数”中,因此该过程返回子子文件夹作为结果。但是大多数发现的例子使用了一个“sub”我总是对“sub”vs“function”感到困惑(我明白当你想要一个需要返回你使用函数的程序时,imho这似乎是本例中的情况) 但我也可以使用“sub”而只是简单的引用输出参数(ByRef pSubfoldersList)

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

1 个答案:

答案 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