0

我正在尝试制作一个脚本,我们可以从不同子文件夹中的文件列表中将特定字符串输出到文件中。

我的脚本有效,但仅适用于一个目录。我需要一些帮助才能使其与子文件夹一起使用

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set folder = objFSO.GetFolder("D:\vbs\logs\") ' here i have loads of subfolders with *.txt 
Set outfile = objFSO.CreateTextFile("D:\vbs\ok\test.txt") ' my output file

for each file in folder.Files
    Set testfile = objFSO.OpenTextFile(file.path, ForReading)

    Do While Not testfile.AtEndOfStream

        If instr (testfile.readline, "central") then ' i output every lines where there is the word "central" 
            outfile.writeline testfile.readline
        End If

        if instr (testfile.readline, "version") then  ' i use this to parse my output file to get a indication between every files read

            num = testfile.readline
            mag = Split(num)
        elseif testfile.AtEndOfStream = true then
            outfile.writeline "Shop " & mag(4)
        end if
    Loop
    testfile.close
next
outfile.close
4

2 回答 2

1

有关文件夹递归示例,请参见类似问题的答案。

不过,关于您现有代码的一个评论:该ReadLine方法的每次调用都会从文件中读取下一行,因此如下所示:

If instr (testfile.readline, "central") then
  outfile.writeline testfile.readline
End If

不会输出包含单词“central”的行(如您的评论所说),而是该行之后行。

如果要输出包含正在检查的单词的行,则必须将读取的行存储在变量中并继续使用该变量:

line = testfile.ReadLine
If InStr(line, "central") Then
  outfile.WriteLine line
End If
于 2013-06-03T21:01:54.247 回答
0

我会将您的整个For...Each块封装到一个新的子例程中,然后添加一个新For...Each块以捕获subFolders父文件夹中的所有内容。我将该功能添加到您的脚本中,请参见下文。

Const ForReading = 1
Const Start_Folder = "D:\vbs\logs\" ' here i have loads of subfolders with *.txt 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set outfile = objFSO.CreateTextFile("D:\vbs\ok\test.txt") ' my output file


'Call the Search subroutine to start the recursive search.
Search objFSO.GetFolder(Start_Folder)

'Close the outfile after all folders have been searched
outfile.Close

Sub Search(sDir)

    for each file in sDir.Files
        Set testfile = objFSO.OpenTextFile(file.path, ForReading)

        Do While Not testfile.AtEndOfStream

            If instr (testfile.readline, "central") then ' i output every lines where there is the word "central" 
                outfile.writeline testfile.readline
            End If

            if instr (testfile.readline, "version") then  ' i use this to parse my output file to get a indication between every files read

                num = testfile.readline
                mag = Split(num)
            elseif testfile.AtEndOfStream = true then
                outfile.writeline "Shop " & mag(4)
            end if
        Loop
        testfile.close
    next

    'Find EACH SUBFOLDER.
    For Each subFolder In sDir.SubFolders

        'Call the Search subroutine to start the recursive search on EACH SUBFOLDER.
        Search objFSO.GetFolder(subFolder.Path)
    Next

End Sub
于 2013-06-03T21:12:54.750 回答