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

Author Topic: Batch file to find a word on my drive  (Read 7161 times)

0 Members and 1 Guest are viewing this topic.

KeithGeorge

    Topic Starter


    Starter

    • Experience: Beginner
    • OS: Windows 10
    Batch file to find a word on my drive
    « on: January 22, 2021, 09:25:47 AM »
    Hi Guys,
    I don’t know if this is possible.

    I would like a batch file that when clicked would prompt for a drive letter then prompt for the word to search for, if the word is found, list all files on that drive that contain that word.

    The word or part of the word could be in  txt, doc, xls, xlsm, csv, eml or pdf, infact any file that I can view.

    Thanks
    Keith

    Hackoo



      Hopeful
    • Thanked: 42
    • Experience: Expert
    • OS: Windows 10
    Re: Batch file to find a word on my drive
    « Reply #1 on: January 22, 2021, 10:35:36 AM »
    Hi  ;)
    Just give a try for this old batch script  Local_Search_Engine.bat

    Code: [Select]
    @ECHO OFF
    REM This Script is written by (c) Hackoo 2016 on 19/09/2016
    Title Scan a folder and Search a string in multi-files by (c) Hackoo 2016
    mode con cols=75 lines=2
    Call :init
    rem Call :CountingExecution
    Call :inputbox "Please enter something to search :" "Search a string in multi-files by (c) Hackoo 2016"
    If  "%input%" == ""  Color 0C & (
    echo(
    echo           You must enter a string to continue with this program
    pause>nul & exit
    ) else (
    Call :Browse4Folder "Choose source folder to scan for %input%" "c:\scripts"
    )
    ::******************************************************************************************
    Set "ROOT=%Location%"
    ::Does string have a trailing back slash ? if yes, so, we remove it !
    IF %ROOT:~-1%==\ SET ROOT=%ROOT:~0,-1%
    :: txt vbs js json hta php htm html xml csv rtf
    SET "EXT=txt vbs js json hta php htm html xml csv rtf"
    SET "Count=0"
    set "Word2Search=%input%"
    Set "NewFolder2Copy=%userprofile%\Desktop\CopyFiles_%Word2Search%"
    Set "LogFile=%~dp0%~n0_%Word2Search%.txt"
    SETLOCAL enabledelayedexpansion
    REM Iterates throw the files on this current folder and its subfolders.
    REM And Populate the array with existent files in this folder and its subfolders
    For %%a in (%EXT%) Do (
    Call :Scanning "%Word2Search%" "*.%%a"
    Call :PS_Sub 'information' 10 '"Scanning now for """%Word2Search%""" on """*.%%a""" . . . "' "'Please wait. . . Scan is in progress on all """*.%%a""" . . .'" 'info' 5
    FOR /f "delims=" %%f IN ('dir /b /s "%ROOT%\*.%%a"') DO (
    ( find /I "%Word2Search%" "%%f" >nul 2>&1 ) && (
    SET /a "Count+=1"
    set "list[!Count!]=%%~nxf"
    set "listpath[!Count!]=%%~dpFf"
    )
    ) || (
    ( Call :Scanning "%Word2Search%" "%%~nxf" )
    )
    )
    ::*******************************************************************
    :Display_Results
    cls & color 0B
    echo wscript.echo Len("%ROOT%"^) + 20 >"%tmp%\length.vbs"
    for /f %%a in ('Cscript /nologo "%tmp%\length.vbs"') do ( set "cols=%%a")
    If %cols% LSS 50 set /a cols=%cols% + 24
    rem If %cols% LSS 50 set /a cols=%cols% + 15
    set /a lines=%Count% + 17
    Mode con cols=%cols% lines=%lines%
    echo(
    Call :color 0A " ------------------------------------------------" 1
    ECHO   Folder : "%ROOT%"
    Call :color 0A " ------------------------------------------------" 1
    rem If Exist "%LogFile%" Del "%LogFile%"
    rem Display array elements
    for /L %%i in (1,1,%Count%) do (
    set "msg=[%%i] - !list[%%i]!"
    echo !msg!
    )
    ECHO(
    ECHO Total of [%EXT%] files(s) that contains
    Echo the string "%Word2Search%" is : %Count% file(s)
    echo.
    Call :color 0D "Type the number of file that you want to explore" 1
    echo(
    Call :color 0C "To save results into a LogFile just type 'LOG'" 1
    echo(
    Call :color 0A "To copy all files found just type 'Copy'" 1
    set /p "Input="
    For /L %%i in (1,1,%Count%) Do (
        If "%INPUT%" EQU "%%i" (
            Call :Explorer "!listpath[%%i]!"
        )
    IF /I "%INPUT%"=="Log" (
    Call :Save_Results
    )
    IF /I "%INPUT%"=="Copy" (
    Call :CopyFiles
    )
    )   
    Goto:Display_Results
    ::****************************************************************************
    :Save_Results
    If Exist "%LogFile%" Del "%LogFile%"
    rem Display array elements and save results into the LogFile
    (
    Echo   ------------------------------------------------
    ECHO   Folder : "%ROOT%"
    echo   ------------------------------------------------
    )>"%LogFile%"

    for /L %%i in (1,1,%Count%) do (
    set "msg=[%%i] - !list[%%i]!"
    echo !msg! -- "!listpath[%%i]!" >> "%LogFile%"
    )

    (
    ECHO.
    ECHO Total of [%EXT%] files(s^) : %Count% file(s^) that contains the string "%Word2Search%"
    )>> "%LogFile%"
    Start "" "%LogFile%"
    Goto:Display_Results
    ::****************************************************************************
    :Scanning <Word> <file>
    mode con cols=75 lines=3
    Cls & Color 0A
    echo(
    echo      Scanning for the string "%~1" on "%~2" ...
    goto :eof
    ::****************************************************************************
    :Explorer <file>
    explorer.exe /e,/select,"%~1"
    Goto :EOF
    ::****************************************************************************
    :init
    prompt $g
    for /F "delims=." %%a in ('"prompt $H. & for %%b in (1) do rem"') do set "BS=%%a"
    exit /b
    ::****************************************************************************
    :color
    set nL=%3
    if not defined nL echo requires third argument & pause > nul & goto :eof
    if %3 == 0 (
        <nul set /p ".=%bs%">%2 & findstr /v /a:%1 /r "^$" %2 nul & del %2 2>&1 & goto :eof
    ) else if %3 == 1 (
        echo %bs%>%2 & findstr /v /a:%1 /r "^$" %2 nul & del %2 2>&1 & goto :eof
    )
    exit /b
    ::***************************************************************************
    :Browse4Folder
    set Location=
    set vbs="%temp%\_.vbs"
    set cmd="%temp%\_.cmd"
    for %%f in (%vbs% %cmd%) do if exist %%f del %%f
    for %%g in ("vbs cmd") do if defined %%g set %%g=
    (
        echo set shell=WScript.CreateObject("Shell.Application"^)
        echo set f=shell.BrowseForFolder(0,"%~1",0,"%~2"^)
        echo if typename(f^)="Nothing" Then 
        echo wscript.echo "set Location=Dialog Cancelled"
        echo WScript.Quit(1^)
        echo end if
        echo set fs=f.Items(^):set fi=fs.Item(^)
        echo p=fi.Path:wscript.echo "set Location=" ^& p
    )>%vbs%
    cscript //nologo %vbs% > %cmd%
    for /f "delims=" %%a in (%cmd%) do %%a
    for %%f in (%vbs% %cmd%) do if exist %%f del /f /q %%f
    for %%g in ("vbs cmd") do if defined %%g set %%g=
    goto :eof
    ::***************************************************************************
    :CountingExecution
    Setlocal enabledelayedexpansion
    Title Count the number of times my BATCH file is run
    Mode Con Cols=60 lines=5 & color 0E
    set /a count=1
    set "FileCount=%tmp%\%~n0.txt"
    If Not exist "%FileCount%" (
    echo !count! > "%FileCount%"
    ) else (
    For /F "tokens=*" %%a in ('Type "%FileCount%"') Do (
    set /a count=!count! + %%a
    echo !count! > "%FileCount%"
    )
    )
    echo.
    echo This batch script is running for "!count! time(s)"
    echo(
    Call :Color 0C "           - - - Hit any key to continue - - -" 1
    EndLocal
    pause>nul
    ::***************************************************************************
    :InputBox
    set "input="
    set "heading=%~2"
    set "message=%~1"
    echo wscript.echo inputbox(WScript.Arguments(0),WScript.Arguments(1)) >"%temp%\input.vbs"
    for /f "tokens=* delims=" %%a in ('cscript //nologo "%temp%\input.vbs" "%message%" "%heading%"') do (
    set "input=%%a"
    )
    exit /b
    ::***************************************************************************
    :PS_Sub $notifyicon $time $title $text $icon $Timeout
    PowerShell  ^
      [reflection.assembly]::loadwithpartialname('System.Windows.Forms') ^| Out-Null; ^
     [reflection.assembly]::loadwithpartialname('System.Drawing') ^| Out-Null; ^
     $notify = new-object system.windows.forms.notifyicon; ^
      $notify.icon = [System.Drawing.SystemIcons]::%1; ^
      $notify.visible = $true; ^
      $notify.showballoontip(%2,%3,%4,%5); ^
      Start-Sleep -s %6; ^
      $notify.Dispose()
    %End PowerShell%
    exit /B
    ::****************************************************************************
    :MakeCopy <Source> <Target>
    If Not Exist "%~2\" MD "%~2\"
    Copy /Y "%~1" "%~2\"
    goto :eof
    ::****************************************************************************
    :CopyFiles
    cls
    mode con cols=80 lines=20
    for /L %%i in (1,1,%Count%) do (
    echo Copying "!list[%%i]!" "%NewFolder2Copy%\"
    Call :MakeCopy "!listpath[%%i]!" "%NewFolder2Copy%">nul 2>&1
    )
    Call :Explorer "%NewFolder2Copy%\"
    Goto:Display_Results
    ::*****************************************************************************

    KeithGeorge

      Topic Starter


      Starter

      • Experience: Beginner
      • OS: Windows 10
      Re: Batch file to find a word on my drive
      « Reply #2 on: January 22, 2021, 10:56:30 AM »
      Thanks for you input.

      I tried you file on my S drive for a word I know is in multiple xlsm files,  multiple Word documents and  multiple txt files, but it only returned 1 hit from a csv file. ???

      Hackoo



        Hopeful
      • Thanked: 42
      • Experience: Expert
      • OS: Windows 10
      Re: Batch file to find a word on my drive
      « Reply #3 on: January 22, 2021, 11:37:02 AM »
      Yes! with a batch file you can only scan those type of files: txt vbs js json hta php htm html xml csv rtf
      xls ; xlsx and pdf are like exe, you can not search on it

      KeithGeorge

        Topic Starter


        Starter

        • Experience: Beginner
        • OS: Windows 10
        Re: Batch file to find a word on my drive
        « Reply #4 on: January 22, 2021, 01:43:10 PM »
        Ok Hackoo thanky you for your time and input.