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
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?
Eso es, y que me cree un archivo en el que diga "tienes la palabra que has tecleado en estos archivos"
Termine, me tarde por que la ultima vez que hice algo así me lleve 104 lineas (https://foro.elhacker.net/scripting/el_signo-t474587.0.html) 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.
@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.
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 (https://foro.elhacker.net/scripting/el_signo-t474587.0.html) 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.
@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?
@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
No veo la diferencia, no lo entiendo. Lo único que veo que tenía mal en foto editada que tenía :exit
Solo tenias q dejar la Sub-rutina BS :
: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.
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
[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)
(https://i.imgur.com/lEWyE71.png)
(https://i.imgur.com/JkZMKPA.png)
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
@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.