Welcome guest. Before posting on our computer help forum, you must register. Click here it's easy and free.

Author Topic: Finding text in files  (Read 4095 times)

0 Members and 1 Guest are viewing this topic.

Barefoot_Tom

    Topic Starter


    Intermediate
    Finding text in files
    « on: December 20, 2008, 09:23:14 AM »
    The DOS DIR command is great, but it does have its limitations. I'm trying to find a particular word as it occurs in all files. and re-direct the results of the search to a text file. I'd also like to be able to exclude some folders (like that with my saved email) which are just going to complicate things.

    I'm using WIN2000, and I know I can use its search function, but that won't allow me to re-direct the results, nor will it let me specify what I'd like to exclude.

    Any ideas?

    Tom


    Sidewinder



      Guru

      Thanked: 139
    • Experience: Familiar
    • OS: Windows 10
    Re: Finding text in files
    « Reply #1 on: December 21, 2008, 06:34:53 AM »
    This little snippet may help:

    Code: [Select]
    @echo off
    setlocal enabledelayedexpansion
    ::
    :: Exclude array
    ::
    set array.1="drive:\path1"
    set array.2="drive:\path2"


    for /f "tokens=* delims=" %%f in ('dir c:\ /a:d /s /b') do (
    for /l %%i in (1, 1, 2) do (
       set count=0
       find /i "!array.%%i!" %%f
         if not errorlevel 1 call set /a count+=1
      )
      if !count! GTR 0 (
         for /f "tokens=* delims=" %%d in ('dir /a:-d /b %%f\%%d ^| find /i "arg") do (
      if not errorlevel  1 echo ....
         )
    )
    )

    Notes:

    1. the highlighted number in this line:  for /l %%i in (1, 1, 2) do (
    must match the number of items in the exclude array.

    2. replace the highlighted arg in this line:
    for /f "tokens=* delims=" %%d in ('dir /a:-d /b %%f\%%d ^| find /i "arg") do (

    3. Replace the dots with redirection of the information you want saved to the text file (ex. echo %%f\%%d >> text.txt)

    Disclaimer: This snippet has not been tested, so drive carefully 8)
    The true sign of intelligence is not knowledge but imagination.

    -- Albert Einstein

    Barefoot_Tom

      Topic Starter


      Intermediate
      Re: Finding text in files
      « Reply #2 on: December 21, 2008, 12:50:43 PM »
      Thanks for the fast response. That sure looks like it will work. I won't have time to try it for a couple of days, but I'll report the results.
      Tom

      Barefoot_Tom

        Topic Starter


        Intermediate
        Re: Finding text in files
        « Reply #3 on: December 22, 2008, 02:26:01 PM »
        I was able to get back to my computer earlier than I expected, and I tried the suggested snippet. Sadly, without luck. I obviously have done something wrong.

        I created a file called "Findword.Bat" and ran it. Here is the file, as written:
        _______________________________________ ____________________
        :: @echo off
        setlocal enabledelayedexpansion
        ::
        :: Exclude array
        ::

        set array.1="c:\Paprport"
        set array.2="C:\Windows"

             for /f "tokens=* delims=" %%f in ('dir c:\ /a:d /s /b') do (
           for /l %%i in (1, 1, 2) do (
              set count=0
              find /i "!array.%%i!" %%f
                if not errorlevel 1 call set /a count+=1
            )
            if !count! GTR 0 (
                      for /f "tokens=* delims=" %%d in ('dir /a:-d /b %%f\%%d ^| find /i  "standard") do (
               
                                  if not errorlevel  1 echo >> FOUNDIT.TXT
               )
           )
        )
        _______________________________________ ___________

        On my hard drive , I have 2 directories named "Paprport" and "Windows" which I was trying to exclude. The is a file in the C:\ folder containing the text "standard".
        I hoped that the program would ignore the 2 folders specified; find the file containing the word "standard", and put the name of that file, and its location into a file called "Founditit.TXT". This didn't happen.
        When run the screen showed line after line reading "Access Denied" and the name of a directory (not only the directories specified in the array, but others as well).
        What have I done wrong, or failed to do right?
        Tom

        Sidewinder



          Guru

          Thanked: 139
        • Experience: Familiar
        • OS: Windows 10
        Re: Finding text in files
        « Reply #4 on: December 22, 2008, 03:57:21 PM »
        Quote
        I obviously have done something wrong

        I told you to drive carefully. ;D 

        Actually you did nothing wrong, it was all my doing. I keep getting carried away, forgetting that batch code is not a programming language. So for my next trick, I went all procedural, which should make it easier to read, if nothing else.

        Code: [Select]
        @echo off
        setlocal enabledelayedexpansion
        ::
        :: Exclude array
        ::
        set array.1=c:\Paprport
        set array.2=c:\windows


        for /f "tokens=* delims=" %%f in ('dir c:\ /a:d /s /b') do (
        set count=0
        for /l %%i in (1,1,2) do (
        if /i !array.%%i! EQU %%f set /a count+=1
        )
        if !count! EQU 0 call :search %%f
        )
        goto :eof

        :search
        for /f "tokens=* delims=" %%d in ('dir %1 /a:-d /b') do (
        find /i "standard" %%f\%%d > nul
        if not errorlevel 1 echo %%f\%%d >> FOUNDIT.TXT
        )


        This code has been tested and appears to meet all your specs.

        Good luck.  8)
        The true sign of intelligence is not knowledge but imagination.

        -- Albert Einstein

        Barefoot_Tom

          Topic Starter


          Intermediate
          Re: Finding text in files
          « Reply #5 on: December 23, 2008, 08:08:53 AM »
          Quote
          I obviously have done something wrong

          I told you to drive carefully. ;D 

          Actually you did nothing wrong, it was all my doing. I keep getting carried away, forgetting that batch code is not a programming language. So for my next trick, I went all procedural, which should make it easier to read, if nothing else.

           This code has been tested and appears to meet all your specs.

          Good luck.  8)

          I tried (actually am trying now) your new code, and it seems to be working. It's slow, but I expected that (Good;Fast:Cheap: You can only have 2 of them).

          Thanks so  much for your help. And a Merry Christmas (or whatever you prefer) to you.
          Tom

          Barefoot_Tom

            Topic Starter


            Intermediate
            Re: Finding text in files
            « Reply #6 on: December 23, 2008, 12:59:28 PM »
            The code finished running, and it looks like it's back to square 1 now. The program found instances of the text I was looking for, and put the name of the file in the new file I wanted it to. Unfortunately, the instances it found were in a sub-directory of a directory I told it to exclude. It did not find the word in a file in the root directory I ran it from.

            When run with the /s switch omitted, nothing was found, and no new file was created. It indicated while running that access was denied to the directories I wanted excluded, however.

            The above was run on a machine using WIN2000. When I tried to run it on a machine with WIN98SE, it wouldn't run at all. It reported problems with the syntax.

            If I wasn't so stubborn, I'd give up, but there's an answer lurking there somewhere.
            Tom

            Sidewinder



              Guru

              Thanked: 139
            • Experience: Familiar
            • OS: Windows 10
            Re: Finding text in files
            « Reply #7 on: December 23, 2008, 04:48:49 PM »
            While I was hunting down my Santa Claus outfit, I found a script in the snippet closet. With a tweak here and a tweak there, we could be talking about a serious script:

            Code: [Select]
            On Error Resume Next
            Const ForReading = 1

            xDir = Array("c:\Paprport", "C:\Windows")    'Exclude array

            Set fso = CreateObject("Scripting.FileSystemObject")
            Set LogFile = fso.CreateTextFile("c:\temp\foundit.txt", True)

            Set dc = fso.Drives
            For each ds in dc
              Select Case ds.Driveletter
                Case "C"                                          'drive to search
                  Set RootDir = fso.GetFolder(ds & "\")           'directory to start search
                  GetTheFolders(RootDir)
              End Select
            Next
            LogFile.Close

            Function GetTheFolders(Folder)
              For Each Subfolder in Folder.SubFolders
              blnExclude = False
              For Each item In xDir
              If InStr(1, SubFolder.Path, item, 1) > 0 Then blnExclude = True
              Next
             
              If blnExclude = False Then
                GetTheFiles(Subfolder.Path)
                GetTheFolders Subfolder
                End If
              Next
            End Function

            Function GetTheFiles(FileFolder)
              Set f = fso.GetFolder(FileFolder)
              Set fc = f.Files
              For Each fs in fc
              If fso.GetExtensionName(fs) = "txt" Then           'Extension to look at
              Set k = fso.OpenTextFile(fs, ForReading)
              strFile = k.ReadAll
                            k.Close
              If InStr(1, strFile, "standard", 1) > 0 Then
              LogFile.WriteLine fs
              End If
              End If
              Next
            End Function

            Yes I know, this is not batch code.  Save the script with a vbs extension and run from the command prompt as cscript scriptname.vbs

            The script will scan the C drive looking for txt files. The drive can be changed and we can add more extensions, but there really is no point in checking exe files for a string.

            Happy Christmas to you and a Merry New Year.  8)
            « Last Edit: December 24, 2008, 04:41:15 AM by Sidewinder »
            The true sign of intelligence is not knowledge but imagination.

            -- Albert Einstein

            Barefoot_Tom

              Topic Starter


              Intermediate
              Re: Finding text in files
              « Reply #8 on: December 24, 2008, 07:36:14 AM »
              While I was hunting down my Santa Claus outfit, I found a script in the snippet closet. With a tweak here and a tweak there, we could be talking about a serious script:

               Yes I know, this is not batch code.  Save the script with a vbs extension and run from the command prompt as cscript scriptname.vbs

              The script will scan the C drive looking for txt files. The drive can be changed and we can add more extensions, but there really is no point in checking exe files for a string.

              Happy Christmas to you and a Merry New Year.  8)

              Thanks for the code. It looks like it would find a string in a TXT file, but only there. What I was trying to do is find a particular string in files of any type, and to exclude directories where the string I was looking for couldn't possibly be found; and then to put the results into a file.

              (A word of explanation for my wanting to do a thing like that might be helpful here. It's for my wife, who is looking for something she stored on her computer, but can't remember the name of the file, nor where she put it; only what it was about.)

              Windows does the first part of what I want to do with its Search (Find) function, but won't do the 2nd part. Nor will it put the results into a file.

              The previous code you sent looked like it would remedy those deficiencies, but it didn't work. I'd like to find out why it wouldn't do what it should have done.

              I'll understand if you throw up your hands at this point. I know I would if I were in your place. I'll keep plugging away at it, though. I hate not being able to figure things out.

              As I often say: I wish I understood all I know about computers.
              Tom

              Sidewinder



                Guru

                Thanked: 139
              • Experience: Familiar
              • OS: Windows 10
              Re: Finding text in files
              « Reply #9 on: December 24, 2008, 08:51:25 AM »
              Quote
              The previous code you sent looked like it would remedy those deficiencies, but it didn't work. I'd like to find out why it wouldn't do what it should have done.

              Which previous code? The VBScript worked fine when it was tested. The previous batch code had it's own set of problems. Anyway I find it easier use a tool that has the functionality I need to reach a solution. Personally I find batch code underpowered and logically exhausting.

              Quote
              Thanks for the code. It looks like it would find a string in a file.TXT file, but only there. What I was trying to do is find a particular string in files of any type, and to exclude directories where the string I was looking for couldn't possibly be found; and then to put the results into a file.

              The excluded directories are in the xDIR array and the file names that contained the search argument were logged to the foundit.txt. I used the temp directory on my system for the log file, you may not have that directory on your system. We can change it to a directory you do have.

              As mentioned, we can add extensions to include or create extensions to exclude. Did you run the VBScript? Can you document any specific problems?

               8)

              The true sign of intelligence is not knowledge but imagination.

              -- Albert Einstein

              Barefoot_Tom

                Topic Starter


                Intermediate
                Re: Finding text in files
                « Reply #10 on: December 24, 2008, 04:26:37 PM »
                Quote
                The previous code you sent looked like it would remedy those deficiencies, but it didn't work. I'd like to find out why it wouldn't do what it should have done.

                Which previous code? The VBScript worked fine when it was tested.  . Did you run the VBScript? Can you document any specific problems?

                 

                The previous code I referred to was the last batch code you sent. I ran the VBScript code you sent, and didn't get any results.
                I can't document any specific problems, since the code ran silently, showing nothing on the screen, All I know is that no file called "Foundit.txt" was created, even though I had specifically created a TXT file in the Root directory containing the string I was searching for.

                I'm not familiar with scripts, so I can't manipulate the code you sent in order to make the results appear on the screen; nor can I, for instance, eliminate sub-directories.

                It looks like I'm going to have to learn scripting, though, since your code, even though it didn't produce results, ran a lot faster than if it were a batch file.

                I do appreciate your efforts, and am sure that the failure to produce results lies with me, not you.
                Tom

                Sidewinder



                  Guru

                  Thanked: 139
                • Experience: Familiar
                • OS: Windows 10
                Re: Finding text in files
                « Reply #11 on: December 25, 2008, 05:25:18 AM »
                Quote
                All I know is that no file called "Foundit.txt" was created, even though I had specifically created a TXT file in the Root directory containing the string I was searching for.

                Perfect! Well, you can always have the search script search for it's output file. ;D

                Code: [Select]
                On Error Resume Next
                Const ForReading = 1

                xDir = Array("c:\Paprport", "C:\Windows")    'Exclude array

                Set fso = CreateObject("Scripting.FileSystemObject")
                Set LogFile = fso.CreateTextFile("c:\temp\foundit.txt", True)

                Set dc = fso.Drives
                For each ds in dc
                  Select Case ds.Driveletter
                    Case "C"                                          'drive to search
                      Set RootDir = fso.GetFolder(ds & "\")           'directory to start search
                      GetTheFolders(RootDir)
                  End Select
                Next
                LogFile.Close

                Function GetTheFolders(Folder)
                  For Each Subfolder in Folder.SubFolders
                  blnExclude = False
                  For Each item In xDir
                  If InStr(1, SubFolder.Path, item, 1) > 0 Then blnExclude = True
                  Next
                 
                  If blnExclude = False Then
                    GetTheFiles(Subfolder.Path)
                    GetTheFolders Subfolder
                    End If
                  Next
                End Function

                Function GetTheFiles(FileFolder)
                  Set f = fso.GetFolder(FileFolder)
                  Set fc = f.Files
                  For Each fs in fc
                  If fso.GetExtensionName(fs) = "txt" Then           'Extension to look at
                  Set k = fso.OpenTextFile(fs, ForReading)
                  strFile = k.ReadAll
                                k.Close
                  If InStr(1, strFile, "standard", 1) > 0 Then
                  'LogFile.WriteLine fs
                                        wscript.echo fs
                  End If
                  End If
                  Next
                End Function

                As before, save the script with a vbs extension and run from the command prompt as cscript scriptname.vbs

                Quote
                I'm not familiar with scripts, so I can't manipulate the code you sent in order to make the results appear on the screen; nor can I, for instance, eliminate sub-directories.

                I modified the script to display the results on the console. It was the sub-directories that gave me problems with the original batch file. With any luck, those problems have been eliminated with the VBScript. Note: c:\windows is excluded from the search, along with all it's sub-directories. Let me know if this is incorrect.

                Quote
                It looks like I'm going to have to learn scripting, though, since your code, even though it didn't produce results, ran a lot faster than if it were a batch file.

                Did you use Windows Search to look for the foundit.txt file (ironic, huh)? It should be in c:\temp. I can't be certain if the CreateTextFile method would create the directory if it was not found.

                I'm not suggesting it (I've been putting off downloading to my system), but Windows Desktop Search can be scripted through the Search object. Windows Update has been bugging me for moths to download it. Might be time to check it out.

                I think next Christmas I'll do without the Santa outfit. ;)
                The true sign of intelligence is not knowledge but imagination.

                -- Albert Einstein

                Barefoot_Tom

                  Topic Starter


                  Intermediate
                  Re: Finding text in files
                  « Reply #12 on: December 25, 2008, 06:36:02 AM »
                  Sorry, the new code didn't work, either. As before, nothing showed on the console while it ran. A file called "Foundit.TXT" was created, but it had no contents.
                  Tom

                  Barefoot_Tom

                    Topic Starter


                    Intermediate
                    Re: Finding text in files
                    « Reply #13 on: December 26, 2008, 09:55:54 AM »
                    SUCCESS!!
                    The latest code you sent did work after all. The fault, as I suspected, was mine. The word I had chosen to search for didn't exist in a TXT file, and therefore couldn't be found. When I substituted a word which did exist, the program ran and produced the appropriate result.

                    Thanks.

                    Now I have to figure out how to search in files with other extensions, or perhaps learn to exclude those extensions which won't contain the string (like EXE or COM files, or image files)

                    'll keep plugging away at it.
                    Tom

                    Sidewinder



                      Guru

                      Thanked: 139
                    • Experience: Familiar
                    • OS: Windows 10
                    Re: Finding text in files
                    « Reply #14 on: December 26, 2008, 11:31:08 AM »
                    Quote
                    SUCCESS!!

                    Glad it worked.

                    Quote
                    Now I have to figure out how to search in files with other extensions, or perhaps learn to exclude those extensions which won't contain the string (like EXE or COM files, or image files)

                    Try creating an array of the extensions like the excluded directories.

                    arrExt = Array("exe", "com", "jpg", "bmp", "png")....add as many as you need, each extension quoted with a comma separator

                    Code: [Select]
                    Function GetTheFiles(FileFolder)
                      Set f = fso.GetFolder(FileFolder)
                      Set fc = f.Files
                      For Each fs in fc
                      blnExclude = False
                      For Each ext In arrExt
                      If LCase(fso.GetExtensionName(fs)) = ext Then
                      blnExclude = True
                      End If
                      Next
                     
                      If blnExclude = False Then
                                Set k = fso.OpenTextFile(fs, ForReading)
                      strFile = k.ReadAll
                                    k.Close
                      If InStr(1, strFile, "standard", 1) > 0 Then
                      'LogFile.WriteLine fs
                                            wscript.echo fs
                      End If
                      End If
                      Next
                    End Function

                    Good luck and Happy New Year!  8)

                    Considering all the file extensions on a PC, this could get interesting.
                    « Last Edit: December 27, 2008, 02:56:36 AM by Sidewinder »
                    The true sign of intelligence is not knowledge but imagination.

                    -- Albert Einstein