批处理文件,用于在文件夹/子文件夹中的所有文件内的文本文件中搜索字符串

时间:2016-11-13 05:49:38

标签: windows batch-file batch-processing

我有一个文本文件(sample.txt),它有近500个字符串,我有文件夹(包),它有许多子文件夹,包含许多不同文件类型的文件(.xml,.cpp,.hpp,还有更多)。

Sample.txt看起来像

gi_70_1
IF_MNE_70F_BLACK
Backserver
Type_Gradient
Area_round

我需要在“package”文件夹中的所有文件中搜索这些字符串,并打印在Result.txt中找到它的路径

这是我到目前为止所做的事情

@echo off
set RESULT_FILE="result.txt"

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

:: Open the file
"%RESULT_FILE%"
popd

但这只打印了找到的搜索字符串名称,也是最后搜索过的字符串,而不是全部。

有人可以帮助我吗

2 个答案:

答案 0 :(得分:2)

findstr /m /L /i /g:sample.txt "Package\*"

应该找到包目录中包含sample.txt文件中任何字符串的所有文件。

请参阅提示中的findstr /?以获取文档。当然,您需要将路径名替换为" package"

/s开关添加到搜索子目录。

>filename添加到命令以将输出放入文件中。

如果没有找到字符串,请添加if errorlevel 1 echo not found>filename将字符串not found放入文件中

答案 1 :(得分:0)

您可以试试这个修改过的批处理脚本:

@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
::*****************************************************************************