Recursion VBS:递归中使用的FileSystemObject

Recursion VBS:递归中使用的FileSystemObject,recursion,vbscript,filesystemobject,Recursion,Vbscript,Filesystemobject,目前,我正在编写一个脚本,它将遍历给定的文件夹并搜索具有特定扩展名的所有文件。然后,它将打印出名称和文件大小的总和。我相信我已经解决了大部分问题,所以这个问题不是关于如何做到这一点 相反,我想知道在递归函数中使用FileSystemObject流的最佳实践是什么。我应该为所有调用(全局调用或已传递调用)使用单个流,还是应该为每个递归步骤创建一个新流 为了增加乐趣,我计划通过UNC路径访问多台PC。是的,我希望有更好的方法来实现这一点,但我对VBS比较陌生 当前代码: 'Recursive Fun

目前,我正在编写一个脚本,它将遍历给定的文件夹并搜索具有特定扩展名的所有文件。然后,它将打印出名称和文件大小的总和。我相信我已经解决了大部分问题,所以这个问题不是关于如何做到这一点

相反,我想知道在递归函数中使用FileSystemObject流的最佳实践是什么。我应该为所有调用(全局调用或已传递调用)使用单个流,还是应该为每个递归步骤创建一个新流

为了增加乐趣,我计划通过UNC路径访问多台PC。是的,我希望有更好的方法来实现这一点,但我对VBS比较陌生

当前代码:

'Recursive Function handles search of files in folder and subfolders.
Function UNCSearchFolder(strUNCRootPath, strUNCNextFolder)  
 Dim objFSOUNCSearchFolder, objFSOUNCSearchFolder2, colFolderList, objFolder, strCurrentFolder, strSubFolder

 'Get list of Subfolders in folder: <Rootpath>\<Nextfolder>
 strCurrentFolder = strUNCRootPath & "\" & strUNCNextFolder & "\"
 Set objFSOUNCSearchFolder = CreateObject("Scripting.FileSystemObject")
 Set objFSOUNCSearchFolder2 = objFSOUNCSearchFolder.GetFolder(strCurrentFolder)
 Set colFolderList = objFSOUNCSearchFolder2.SubFolders

 'Subfolder dive
 For Each objFolder in colFolderList
  strSubFolder = objFolder.name
  'REMOVE THIS ECHO LATER
  wscript.echo strSubFolder
  UNCSearchFolder(strCurrentFolder, strSubFolder)
 Next

 'Search for files here


 'GC on File Streams
 Set objFSOUNCSearchFolder2 = Nothing
 Set objFSOUNCSearchFolder = Nothing
End Function
“递归函数处理文件夹和子文件夹中文件的搜索。
函数UnSearchFolder(strUNCRootPath、StrunNextFolder)
Dim objFSOUNCSearchFolder、objFSOUNCSearchFolder 2、colFolderList、objFolder、STRURENTFOLDER、STRSUBFOLER
'获取文件夹中的子文件夹列表:\
strCurrentFolder=strUNCRootPath&“\”&strUNCNextFolder&“\”
设置objFSOUNCSearchFolder=CreateObject(“Scripting.FileSystemObject”)
设置objFSOUNCSearchFolder2=objFSOUNCSearchFolder.GetFolder(strCurrentFolder)
设置colFolderList=objFSOUNCSearchFolder2.SubFolders
'子文件夹潜水
对于colFolderList中的每个objFolder
strSubFolder=objFolder.name
'稍后删除此回音
wscript.echo strSubFolder
取消搜索文件夹(strCurrentFolder、strSubFolder)
下一个
'在此处搜索文件
'文件流上的GC
设置objFSOUNCSearchFolder2=无
设置objFSOUNCSearchFolder=Nothing
端函数
那么,所有访问都应该使用一个文件流,还是每个步骤单独使用一个文件流?这是一个没有实际意义的问题吗?这会导致多个连接到每个系统,还是应该只使用一个?基本上,我希望脚本能够在不中断用户或导致奇怪响应(即活动连接耗尽)的情况下工作。该脚本只会在我们正在进行的审计中使用几次,但最终可能会被重新调整用途以用于未来的审计


让我知道你的想法。感谢您的帮助,

如果您选择在函数中设置对FSO的引用, 然后在每个递归中将使用新的FSO对象

使用单个FSO对象(全局或已传递)就足够了。 至少我不知道使用多个FSO实例有什么好处

[编辑]我感谢@AnsgarWiechers的评论,为了使代码准备好重复使用,同时不让FSO进入函数,我们可以将函数封装在一个类中

With New FileInfo
    WScript.Echo .FileSize("C:\temp", "txt", True)
End With


Class FileInfo

    Private m_oFSO

    Public Function FileSize(sRootDir, sExtension, bRecursive)
        Dim oFolder, oFile, sFExt
        sFExt = LCase(sExtension)
        Set oFolder = m_oFSO.GetFolder(sRootDir)
        For Each oFile In oFolder.Files
            If LCase(m_oFSO.GetExtensionName(oFile.Name)) = sFExt Then
                FileSize = FileSize + oFile.Size
            End If
        Next
        If bRecursive Then
            Dim oSubFolder
            For Each oSubFolder In oFolder.SubFolders
                FileSize = FileSize + FileSize(oSubFolder, sExtension, True)
            Next
        End If
    End Function

    Private Sub Class_Initialize
        Set m_oFSO = CreateObject("Scripting.FileSystemObject")
    End Sub

    Private Sub Class_Terminate
        Set m_oFSO = Nothing
    End Sub

End Class

据我所知,不使用全局
FileSystemObject
的唯一原因是使函数自包含(这样它就可以很容易地在其他脚本中重复使用)。谢谢您的回答。很高兴将来知道,但在与我的一个朋友交谈后,他提出了使用WMI的理由。问题是由于活动连接造成的;他的想法是,多个FSO将导致多个活动连接,从而导致超时(或者,即使使用一个FSO,也可能在使用完后无法关闭与上一台PC的连接)。不过,当使用本地路径时,这将很好地工作。我确信大多数编码器不考虑在递归中优化FSO调用,因此您得到了我对这个问题的赞成票。