用于搜索大文本文件的.bat文件

时间:2016-10-06 05:59:35

标签: batch-file cmd

我有一个bat文件,可以查看同一文件夹中的大文本文件,并从您搜索的内容中转储字符串。它可以搜索多个文件,但是如果有2个文本文件包含您要搜索的内容,则它们不会在输出中显示为单独的字符串。如果有人能找到解决方案,那就太棒了

@echo off
title Dumper
color 2
:start
cls
set input=
set /p input= Name To Dump :
findstr /s /i "%input%" *.*  > "%input%_dump.txt"
if %errorlevel%==0 (
echo Dumped All Occurrences For %input% Into %input%_dump.txt
) else (
echo No Data Found
timeout /t 5000
goto start
)
timeout /t 5000
cls
goto start

http://pastebin.com/MkhpzFu1

如果我有2个文本文件说测试

,这是我得到的输出

的1.txt:的test2.txt:测试

如果我有一个文本文件,其中“test”写了两次,输出就是输出(输出是我在上面搜索2个文本文件时应该看的样子)

的1.txt:测试 的1.txt:测试

2 个答案:

答案 0 :(得分:1)

我很快修改了这个脚本: "Local_Search_Engine.bat" 只是为了搜索*.txt个文件

所以试试看结果:

<强> Searching_in_txt_files.bat

@ECHO OFF
Title Scan a folder and Search a string in multi-text-files by (c) Hackoo 2016
mode con cols=75 lines=2
Call :init
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 so we remove it !
IF %ROOT:~-1%==\ SET ROOT=%ROOT:~0,-1%
Set "NewFolder2Copy=%userprofile%\Desktop\Searching_%input%_Files"
SET "EXT=txt"
SET "Count=0"
set "Word2Search=%input%"
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% + 12
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 and save results into the LogFile
for /L %%i in (1,1,%Count%) do (
    echo [%%i] : !list[%%i]!
    echo [%%i] : !list[%%i]! -- "!listpath[%%i]!" >> "%LogFile%"     
)

(   
    ECHO.
    ECHO Total of [%EXT%] files(s^) : %Count% file(s^) that contains the string "%Word2Search%"
)>> "%LogFile%"
ECHO(
ECHO Total of [%EXT%] files(s) : %Count% file(s)
echo.
Call :color 0D "   Type the number of file that you want to explore" 1
echo(
Call :color 0C "     To save those files just hit 'S'" 1
set /p "Input="
For /L %%i in (1,1,%Count%) Do (
    If "%INPUT%" EQU "%%i" (
        Call :Explorer "!listpath[%%i]!"
    )
    IF /I "%INPUT%"=="S" (
        Call :CopyFiles
    )
)   
Goto:Display_Results
::**************************************************************
:Scanning <Word> <file>
mode con cols=75 lines=3
Cls & Color 0E
echo(
echo         Scanning for the string "%~1" on "%~2" ...
goto :eof
::*************************************************************
:Explorer <file>
explorer.exe /e,/select,"%~1"
Goto :EOF
::*************************************************************
: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
::***************************************************************************
: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
::****************************************************************************
: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
::****************************************************************************
: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
::***************************************************************************

答案 1 :(得分:0)

如果untidy表示&#34;我不想拥有文件名&#34;,替换

findstr /s /i "%input%" *.*  > "%input%_dump.txt"

type *.* 2>nul | findstr /s /i "%input%" > "%input%_dump.txt"

修改

使用附加信息(示例输出),我试图重现您的症状。

您的问题可能是:第一个文件中的搜索字符串位于最后一行,此行没有换行符(行尾)。没有&#34;很好&#34;处理这个的方法,但以下应该做(虽然没有文件名):

for %%a in (*.txt) do type %%a|findstr "hello"

作为替代方案,您可以在运行findstr之前为每个文件添加换行符(可能是也可能不是您的选项):

for %%a in (*.txt) do echo/>>%%a
findstr /s /i "%input%" *.txt  > "%input%_dump.txt"