如何递归地获取子文件夹中的文件详细信息?

How can I get file details in subfolders recursively?

我正在尝试编制一份有关我计算机上音乐文件的具体细节的列表,但我对 VBS 的了解有限。 (其实,我做过一些VBA,但之前没有VBS。)我在网上找到了两个脚本:一个获取文件夹中的文件详细信息,另一个递归列出子文件夹和文件的名称。我试图将两者结合起来,但我 运行 遇到了问题,因为第一个脚本以 CreateObject("Shell.Application") 开头,第二个以CreateObject("Scripting.FileSystemObject")。委婉地说,这(即 Shell 与 FSO)是我缺乏知识的 VBS 脚本编写领域之一。

我的脚本中的不兼容性出现在 For Each objFile in colFiles 循环中,这是我从上面提到的“Shell 脚本”插入的。我该怎么做才能使这个脚本起作用?

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim StartFolder, FileName, fso, MyFile, Tabs, arrDetails(4)

Tabs = ""

arrDetails(0) = 0
arrDetails(1) = 1
arrDetails(2) = 27
arrDetails(3) = 28

StartFolder = "C:\Users\user\Music\MP3s"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(StartFolder)

FileName = "C:\Users\user\Documents\MP3 File Details.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.OpenTextFile(FileName, ForAppending, True, True)

MyFile.WriteLine objFolder.Path

ShowSubfolders objFSO.GetFolder(StartFolder), Tabs, arrDetails


Sub ShowSubFolders(Folder, ByVal Tabs, arrDetails)
  Dim TabsFolder, TabsFiles, FileLine, arrText(4), i, d

  TabsFolder = Tabs & "" & vbtab & ""

  For Each Subfolder in Folder.SubFolders
    MyFile.WriteLine
    MyFile.WriteLine TabsFolder & Subfolder.Name

    TabsFiles = TabsFolder & "" & vbtab & ""

    Set objSubFolder = objFSO.GetFolder(Subfolder.Path)
    Set colFiles = objSubFolder.Files

    'Original inserted code for getting file details
'    For Each strFileName in objFolder.Items
'      For i = 0 to 3
'        d = arrDetails(i)
'        arrText(i) = objFolder.GetDetailsOf(strFileName, d)
'      Next
'    
'      FileLine = arrText(0)
'      For i = 1 to 3
'        FileLine = FileLine & vbtab & arrText(i)
'      Next
'      MyFile.WriteLine FileLine
'    Next

    'Attempt to make code compatible with rest of script
    For Each objFile in colFiles
      If LCase(InStr(1, objFile.Name, ".mp3")) > 1 then
        For i = 0 to 3
          d = arrDetails(i)
          arrText(i) = colFiles.GetDetailsOf(objFile, d)
        Next

        FileLine = arrText(0)
        For i = 1 to 3
          FileLine = FileLine & vbtab & arrText(i)
        Next

        MyFile.WriteLine TabsFiles & FileLine
      End If
    Next

    ShowSubFolders Subfolder, TabsFolder, arrDetails
  Next
End Sub

MyFile.Close

在这种情况下,您确实需要 FileSystemObject and the Windows Shell 对象。您使用 FileSystemObject 遍历文件夹。在每个文件夹中,然后使用 Windows Shell 对象获取文件详细信息。

这是一个修改后的 ShowSubFolders Sub,它将按预期工作:

Sub ShowSubFolders(Folder, Tabs, arrDetails)
    Dim TabsFolder, TabsFiles, FileLine, arrText(4), i, d
    Dim objShell
    Dim objFolder
    Dim objSubfolder
    Dim objFiles
    Dim objFile
    Dim sFileName
    
    Set objShell = CreateObject("Shell.Application")

    TabsFolder = Tabs & "" & vbTab & ""
    
    For Each objSubfolder In Folder.SubFolders
    
        ' Write subfolder to file
        MyFile.WriteLine
        MyFile.WriteLine TabsFolder & objSubfolder.Name
        
        ' Increment tab position
        TabsFiles = TabsFolder & "" & vbTab & ""
        
        Set objFolder = objShell.Namespace(objSubfolder.Path)
        Set objFiles = objSubfolder.Files
        
        For Each sFileName In objFolder.Items
            
            ' Check if file is MP3
            If InStr(1, LCase(sFileName), ".mp3") > 0 Then
            
                ' Get file details
                For i = 0 To 3
                    d = arrDetails(i)
                    arrText(i) = objFolder.GetDetailsOf(sFileName, d)
                Next
                
                ' Build file information line
                FileLine = arrText(0)
                For i = 1 To 3
                    FileLine = FileLine & vbTab & arrText(i)
                Next
                
                ' Write file information to file
                MyFile.WriteLine TabsFiles & FileLine
            
            End If
            
        Next
        
        ' Call recursively to handle subfolders
        ShowSubFolders objSubfolder, TabsFolder, arrDetails
  
    Next

End Sub

您注释掉的代码很好,并且可以使用您拥有的 arrDetails 访问扩展文件属性(例如长度和比特率)。

此修订后的子程序中还包含有关翻转 InStrLCase.

的评论中提到的修复程序 Arno Van Boven