Ingrese un archivo txt con cadenas y busque esas cadenas en todas las carpetas / subcarpetas


-1

Tengo un archivo sample.txt con alrededor de 1000 cadenas y tengo una carpeta de carpeta principal "adapt" que contiene muchos archivos (los archivos también están presentes dentro de muchas subcarpetas y los tipos de archivos son .xml, .cpp, .h y algunos más) .

Necesito un script por lotes que tomará la entrada como el archivo sample.txt (que está presente en el mismo directorio donde está el script por lotes) y le pide al usuario que seleccione la carpeta / permite al usuario modificar la ruta de la carpeta en el código (carpeta también está presente en el mismo directorio que el archivo por lotes), y dentro de la carpeta y subcarpetas en todos los tipos de archivos, tiene que buscar cada cadena en el archivo sample.txt y, si se encuentra, escriba "encontrado" en el archivo result.txt / if no encontrado escriba "no encontrado" en el archivo result.txt.

Aquí hay algunas cadenas en el archivo de texto

paquete

servidor_i_0

P_70_d1

gi_m_70_d2

Encontré un script que le pide al usuario una cadena y le da las coincidencias en otro archivo de texto, pero tengo problemas para actualizarlo. Aquí está lo que encontré enlace .

El código que estoy tratando de modificar está debajo.

@echo off
set OUTPUT_FILE="output.txt"
set /p "var1=Enter the String to Find: "

pushd %~p0
type NUL > %OUTPUT _FILE%.tmp
for /f "delims=" %%a in ('dir /B /S *.txt') do (
for /f "tokens=3 delims=:" %%c in ('find /i /c "%var1%" "%%a"') do (
    for /f "tokens=*" %%f in ('find /i "%var1%" "%%a"') do if %%c neq 0 echo         %%f
)
) >> "%OUTPUT_FILE%".tmp
move %OUTPUT_FILE%.tmp %OUTPUT_FILE% >nul 2>&1

popd

Cualquier ayuda con el guión por favor.


Entonces tienes muchas carpetas, archivos, extensiones y palabras clave. Pero no hay código de sus intentos ni una muestra de salida esperada.
LotPings

Tenga en cuenta que superuser.com no es un servicio gratuito de escritura de script / código. Si nos dice lo que ha intentado hasta ahora (incluya los scripts / código que ya está usando) y dónde está atascado, entonces podemos intentar ayudarlo con problemas específicos. También deberías leer ¿Cómo hago una buena pregunta? .
DavidPostill

Intenté modificar el código provisto en el enlace anterior, pero no funcionó, todavía tengo problemas con eso. No quiero poner un código que no funciona, el resultado esperado es "cadena encontrada / no encontrada" para cada cadena que paso del archivo de texto para buscar en las carpetas @LotPings
S6633d

Estoy tratando de modificar el código proporcionado en el enlace anterior y he mencionado mi salida esperada, ¿quieres que escriba el código que no funciona? Estoy tratando de modificar @DavidPostill
S6633d

Respuestas:


0

Puede verificar mi respuesta en esta pregunta de desbordamiento de pila : también la he pegado a continuación:

@ECHO OFF
REM This Script is written and modified by (c) Hackoo 2016 on 13/11/2016
Title Scan a folder and Search a string in multi-files by (c) Hackoo 2016
mode con cols=75 lines=2
Call :init
Call :Browse4Folder "Choose source folder to scan" "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%
SET "EXT=xml cpp hpp"
SET "Count=0"
Set "NewFolder2Copy=%userprofile%\Desktop\CopyFiles"
Set "LogFile=%~dp0%~n0_Log.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 /F %%i in ('Type "sample.txt"') do (
Set "Word2Search=%%i"
    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 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) found
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^) found
)>> "%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
::***************************************************************************
: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
::*****************************************************************************
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.