problema findstr

Iniciado por ramos_45, 3 Octubre 2018, 16:37 PM

0 Miembros y 2 Visitantes están viendo este tema.

ramos_45

Necesito buscar archivos en un directorio que contienen un texto metido a mano, para ello hago:

echo off set /p nombre=Dime tu nombre: echo Hola %nombre%!


echo off
set /p textoabuscar=escribe el texto a buscar:

Findstr /i /s /m /c:%textoabuscar% > archivos.txt
Pause


Pero no me saca nada. Quiero que solo me diga que archivos contienen lo introducido en el directorio

**Aincrad**

No te estoy entendiendo muy bien, explícate. lo que entendí : osea tienes un directorio con varios .txt y quieres crear un bat que busque en todos esos .txt una palabra. es eso?




ramos_45

Eso es, y que me cree un archivo en el que diga "tienes la palabra que has tecleado en estos archivos"

**Aincrad**

#3
Termine, me tarde por que la ultima vez que hice algo así me lleve 104 lineas y de paso código mal optimizado .

Pero ahora soy mas cuidadoso . y optimizo muy bien mis script.

El code Busca en todos los .txt la palabra que tu escribas. (Pon el bat en la carpeta donde tienes tus txt) o bueno lo modificas a tu gusto.

Código (bash) [Seleccionar]
@echo off
Rem By **Aincrad**
del %temp%\a.txt>nul
del lista.txt>nul
:menu & cls  
color a
echo ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿    EL
echo ³                                                               ³ H
echo ³                                                               ³  a
echo ³   Entrodusca la Palabra / Frase a Buscar.                     ³   c
echo ³                                                               ³    k
echo ³                                                               ³     e
echo ³                                                               ³      r
echo ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ       .NET
echo    Create BY **Aincrad**  Foro el hacker.NET
Set /P string=^>^>^>
if not defined string (goto:menu) >NUL
cls

for %%x in (*.txt) do (echo %%x >> %temp%\a.txt)

for /f "delims=·" %%A IN (%temp%\a.txt) do call:Bs "%%A"

:Bs
cls
  set file=%~1
  if not exist %file% exit >nul
  Echo Por Favor Espere...
  findstr /i %string% %file%
  if %errorlevel% == 0 echo Palabra %string% Encontrada en %file% >> lista.txt
 


100% FUNCIONAL con palabras. y bien optimizado , pruebalo.




ramos_45

Cita de: **Aincrad** en  3 Octubre 2018, 18:46 PM
Termine, me tarde por que la ultima vez que hice algo así me lleve 104 lineas y de paso código mal optimizado .

Pero ahora soy mas cuidadoso . y optimizo muy bien mis script.

El code Busca en todos los .txt la palabra que tu escribas. (Pon el bat en la carpeta donde tienes tus txt) o bueno lo modificas a tu gusto.

Código (bash) [Seleccionar]
@echo off
Rem By **Aincrad**
del %temp%\a.txt>nul
del lista.txt>nul
:menu & cls 
color a
echo ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿    EL
echo ³                                                               ³ H
echo ³                                                               ³  a
echo ³   Entrodusca la Palabra / Frase a Buscar.                     ³   c
echo ³                                                               ³    k
echo ³                                                               ³     e
echo ³                                                               ³      r
echo ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ       .NET
echo    Create BY **Aincrad**  Foro el hacker.NET
Set /P string=^>^>^>
if not defined string (goto:menu) >NUL
cls

for %%x in (*.txt) do (echo %%x >> %temp%\a.txt)

for /f "delims=·" %%A IN (%temp%\a.txt) do call:Bs "%%A"

:Bs
cls
   set file=%~1
   if not exist %file% exit >nul
   Echo Por Favor Espere...
   findstr /i %string% %file%
   if %errorlevel% == 0 echo Palabra %string% Encontrada en %file% >> lista.txt
   


100% FUNCIONAL con palabras. y bien optimizado , pruebalo.


funciona perfecto.

he añadido "" a %file% porque en archivos con varias palabras de nombre fallaba.

he intentado añadir 

set file=%~1
   if not exist %file% goto :exit
   Echo Por Favor Espere...
   findstr /i %string% "%file%"
   if %errorlevel% == 0 echo Palabra %string% Encontrada en %file% >> lista.txt


:exit
type lista.txt
pause
exit >nul

para que me muestre en la shell el archivo que genera antes de salir, pero deja de funcionar porque solo me registra 1 archivo.

que le sucede?

**Aincrad**

Código (bash) [Seleccionar]
@echo off
Rem By **Aincrad**
del %temp%\a.txt>nul
del lista.txt>nul
:menu & cls 
color a
echo ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿    EL
echo ³                                                               ³ H
echo ³                                                               ³  a
echo ³   Entrodusca la Palabra / Frase a Buscar.                     ³   c
echo ³                                                               ³    k
echo ³                                                               ³     e
echo ³                                                               ³      r
echo ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ       .NET
echo    Create BY **Aincrad**  Foro el hacker.NET
Set /P string=^>^>^>
if not defined string (goto:menu) >NUL
cls

for %%x in (*.txt) do (echo %%x >> %temp%\a.txt)

for /f "delims=·" %%A IN (%temp%\a.txt) do call:Bs "%%A"



:leer
cls
color b
type lista.txt
pause>nul
exit

:Bs
cls
   set file=%~1
   if not exist %file% goto leer
   Echo Por Favor Espere...
   findstr /i %string% "%file%"
   if %errorlevel% == 0 echo Palabra %string% Encontrada en %file% >> lista.txt




ramos_45

No veo la diferencia, no lo entiendo. Lo único que veo que tenía mal en foto editada que tenía :exit

**Aincrad**

#7
Solo tenias q dejar la Sub-rutina BS :

Código (bash) [Seleccionar]
:Bs
cls
  set file=%~1
  if not exist %file% goto leer
  Echo Por Favor Espere...
  findstr /i %string% "%file%"
  if %errorlevel% == 0 echo Palabra %string% Encontrada en %file% >> lista.txt


De ultimo (osea al final de batch) y ya eso es todo. eso se debe por que no puse el :

GOTO :EOF

Eso era todo.

PD: no te puedo explicar mas por que ando un poco ocupado. vuelvo dentro de unas 3 horas bay.




Eleкtro

#8
Existen multitud de aplicaciones comerciales/profesionales, como por ejemplo FileLocator Pro, software el cual recomiendo encarecidamente para buscar texto en todo tipo de archivos mediante filtros y expresiones regulares.

Pero si por cualquier motivo no quieres recurrir a ese tipo de aplicaciones y si en su lugar prefieres hacerlo mediante un lenguaje de scripting soportado por Windows, entonces Batch es la peor herramienta que existe a tu disposición, muy limitada e ineficiente en términos de rendimiento, sobre todo en la manipulación/lectura de archivos de texto, por eso es mucho mejor recurrir a lenguajes más óptimos como sería Visual Basic Script o Powershell para el siguiente ejemplo que he escrito...

Script.ps1
Código (php) [Seleccionar]
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')

[string]$dirPath  = $([System.IO.Directory]::GetCurrentDirectory())
[string]$fileExt  = "txt"
[enum]  $textCase = [System.StringComparison]::OrdinalIgnoreCase

Do {
   [string]$keyword = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the keyword to find:",
                                                                    "Search text within *.$fileExt files...")
} while ( [System.String]::IsNullOrEmpty($keyword) )

[System.Collections.ArrayList]$files = New-Object System.Collections.ArrayList

Get-ChildItem $dirPath -Filter *.$fileExt |
Foreach-Object {
   [string]$content = [System.IO.File]::ReadAllText($_.FullName)
      [int]$indexOf = $content.IndexOf($keyword, $textCase)

   if ($indexOf -ne -1) {
       $files.Add($_.FullName) > $null
   }

}

[string]$title = [string]::Format("Directory: '{0}'' | Found {1} *.{2} files containing keyword: '{3}'",
                                 $dirPath, ($files.Count), $fileExt, $keyword)

Write-Host $title

if ($files.Count -ne 0) {
   Get-ChildItem $files
   Get-ChildItem $files | Out-GridView -Title $title -PassThru
}

$files.Clear()
Exit(0)









De todas formas si quieres hacerlo en Batch, lo cual no recomiendo en absoluto, puedes guiarte por este ejemplo de aquí abajo o también los que ya te hayan mostrado previamente en los comentarios de arriba...

Script.cmd
Código (dos) [Seleccionar]
@Echo OFF & (CHCP 1252)1>Nul

Set    "dirPath=%~dp0"
Set    "fileExt=txt"
Set    "textCase=/I"
Set /P "keyword=Enter the keyword to find in *.%fileExt% files: "

CLS
FOR %%# IN ("%dirPath%\*.%fileExt%") DO (
   (FindStr.exe %textCase% "%keyword%" "%%~f#")1>NUL && (
       Echo:%%~nx#
   )
)

Pause
Exit /B 0


Saludos.