1

現在、特定のフォルダーを調べて、特定の拡張子を持つすべてのファイルを検索するスクリプトに取り組んでいます。次に、名前が出力され、ファイルサイズが合計されます。私はほとんどの問題を整理したと思うので、この質問はこれを行う方法についてではありません。

代わりに、再帰関数でFileSystemObjectストリームを使用するためのベストプラクティスを知りたいです。すべての呼び出し(グローバルまたはパス)に単一のストリームを使用する必要がありますか、それとも再帰ステップごとに新しいストリームを作成する必要がありますか?

さらに楽しくするために、これを複数のPCにアクセスさせ、UNCパスを介してアクセスさせることを計画しています。はい、これを行うためのより良い方法があると思いますが、私は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

では、すべてのアクセスに1つのファイルストリームを使用する必要がありますか、それとも各ステップで1つのファイルストリームを個別に使用する必要がありますか?それは論点ですか?これにより、各システムへの複数の接続が発生しますか、それとも1つだけを使用する必要がありますか?基本的に、ユーザーを混乱させたり、奇妙な応答(つまり、アクティブな接続が不足したり)を引き起こしたりすることなく、スクリプトを機能させたいと考えています。このスクリプトは、私たちが行っている監査に2、3回しか使用されませんが、最終的には将来の監査に転用される可能性があります。

どう考えているか教えてください。助けてくれてありがとう、

4

1 に答える 1

2

関数内で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
于 2013-02-16T15:36:39.833 に答える