user2816085
user2816085

Reputation: 655

Search a file recursively for string

I am using some vbscript to search for string inside a directory. Now I need my script to search for multiple instance of string in each file and return line number or some other identifiable information. My current vbscript is :-

Sub ProcessFolder(FolderPath)
    On Error Resume Next
    Set fldr = fso.GetFolder(FolderPath)

    Set Fls = fldr.files
    For Each thing in Fls
        Set contents = thing.OpenAsTextStream
        If err.number = 0 then
            Test = Instr(contents.readall, searchterm) 
            If Isnull(test) = false then If Test > 0 then ObjOutFile.WriteLine thing.path 
            demo.innerHtml = demo.innerHtml & thing.path & "<br>"
        Else
            err.clear
        End If
    Next

    Set fldrs = fldr.subfolders
    For Each thing in fldrs
        ProcessFolder thing.path
    Next
End Sub

I need to iterate through lines of each file to get line numbers containing string.

Upvotes: 1

Views: 657

Answers (1)

user5721973
user5721973

Reputation:

Reads each line and searches each line. Also remembers the previous search and directory.

Two issues that you can fix.

  1. It will now hits the 5 million statement timeout message esp if going through exe files.

  2. It won't find Unicode text.

This is the third time I've written the program.

<HTML> 
<HEAD><TITLE>Simple Validation</TITLE> 
<SCRIPT LANGUAGE="VBScript">
Dim Dirname
Dim Searchterm
Dim FSO
Dim objOutFile


Sub Browse
    On Error Resume Next
    Set bffShell = CreateObject("Shell.Application")
    Set bff = bffShell.BrowseForFolder(0, "Select the My Documents folder", 9)
    If Err.number<>0 Then
        MsgBox "Error Setting up Browse for Folder"
    Else
        A = bff.ParentFolder.ParseName(bff.Title).Path
        If err.number=424 then err.clear
                tb2.value = A
    End If
End Sub

Sub Search
    On Error Resume Next
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.RegWrite "HKCU\Software\StackOverflow\VBS\Searchterm", tb1.value
    WshShell.RegWrite "HKCU\Software\StackOverflow\VBS\Directory", tb2.value
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objOutFile = fso.CreateTextFile("results.txt",True)
    Dirname = tb2.value
    Searchterm = tb1.value
    ProcessFolder DirName
End Sub

Sub ProcessFolder(FolderPath)
    On Error Resume Next
    Set fldr = fso.GetFolder(FolderPath)

    Set Fls = fldr.files
    For Each thing in Fls
        Set contents = thing.OpenAsTextStream
        If err.number = 0 then
        Linenum = 0
        Do Until contents.AtEndOfStream
            line = contents.readline
            Linenum = Linenum + 1
                Test = Instr(line, searchterm) 
                If Isnull(test) = false then If Test > 0 then ObjOutFile.WriteLine LineNum & "  " & thing.path
        Loop
        Else
            err.clear
        End If
    Next

    Set fldrs = fldr.subfolders
    For Each thing in fldrs
        ProcessFolder thing.path
    Next

End Sub

Sub Init
    On Error Resume Next
    Set WshShell = CreateObject("WScript.Shell")
    tb1.value = WshShell.RegRead("HKCU\Software\StackOverflow\VBS\Searchterm")
    tb2.value = WshShell.RegRead("HKCU\Software\StackOverflow\VBS\Directory")
End Sub

</script>
</head>
<body Onload=Init>
<p><INPUT Name=tb1 TYPE=Text Value="Search">
<p><INPUT Name=tb2 TYPE=Text Value="Folder"> <INPUT NAME="Browse" TYPE="BUTTON" VALUE="Browse" OnClick=Browse>
<p><INPUT NAME="Search" TYPE="BUTTON" VALUE="Search" OnClick=Search>
</body>
</html>

Upvotes: 2

Related Questions