Computer Hope

Microsoft => Microsoft DOS => Topic started by: KeithGeorge on January 22, 2021, 09:25:47 AM

Title: Batch file to find a word on my drive
Post by: KeithGeorge 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
Title: Re: Batch file to find a word on my drive
Post by: Hackoo on January 22, 2021, 10:35:36 AM
Hi  ;)
Just give a try for this old batch script  Local_Search_Engine.bat (https://pastebin.com/ADdjPEfH)

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
::*****************************************************************************
Title: Re: Batch file to find a word on my drive
Post by: KeithGeorge 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. ???
Title: Re: Batch file to find a word on my drive
Post by: Hackoo 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
Title: Re: Batch file to find a word on my drive
Post by: KeithGeorge on January 22, 2021, 01:43:10 PM
Ok Hackoo thanky you for your time and input.