2016-11-13 6 views
1

私は、約500文字の文字列を持つテキストファイル(sample.txt)を持っており、多くのサブフォルダさまざまなファイルタイプのファイル(.xml、.cpp、.hpp、その他)フォルダ/サブフォルダ内のすべてのファイル内のテキストファイル内の文字列を検索するバッチファイル

Sample.txtをここで私は、「パッケージ」フォルダ内のすべてのファイルにこれらの文字列を検索し、それがResult.txt

に発見されたパスを印刷する必要が

gi_70_1 
IF_MNE_70F_BLACK 
Backserver 
Type_Gradient 
Area_round 

のように見えます

@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 

しかしこれは、検索された検索文字列名と、あまりにも最後に検索された文字列だけを表示するものであり、すべてではありません。

は、誰かがあなたのsample.txtファイル内の文字列のいずれかが含まれているあなたのパッケージディレクトリ内のすべてのファイルを見つける必要があり、この

+0

あなたは=一瞬そのような何かを試すことができます=> [Local_Search_Engine.bat](http://pastebin.com/ADdjPEfH) – Hackoo

答えて

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

で私を助けてもらえます。

マニュアルのプロンプトからfindstr /?を参照してください。当然のことながら、 "パッケージ"のパス名を置換する必要があります

/sサブディレクトリの検索も切り替えてください。


>filenameを出力してファイルに出力します。

何の文字列が

0

を見つからない場合は、この修正バッチスクリプトのために試してみることができ、ファイルに文字列not foundを置くためにif errorlevel 1 echo not found>filenameを追加します。

@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 
::***************************************************************************** 
関連する問題