在多个 .txt 文件中查找字符串

Find string in multiple .txt files

我有一个包含许多 .txt 文件的文件夹。我想在所有这些文件中找到字符串 "X" 然后我想将找到的字符串复制到 .txt 文件到不同的文件夹中。

到目前为止我已经试过了:

@echo on
findstr /m "X" "%userprofile%\Desktop\New_Folder\New_Folder\*.txt"
if %errorlevel%==0 do (
for %%c in (*.txt) do (
type %%c >> "%UserProfile%\Desktop\New_Folder\%%~nc.txt"
pause

我不明白输出 %%~nc.txt 部分,它支持将更改的 .txt 文件复制到同名的新文件夹中。

我想指出的是,字符串 "X" 出现在 .txt 文件的不同位置。

你很接近,但是检查 findstrErrorLevel 在这里没有意义,因为这反映了整体结果,即 ErrorLevel 设置为 0 如果 任何 个文件包含搜索字符串。

我会使用 for /F 循环解析 findstr /M 的输出,并将返回的文件复制到正文中:

for /F "eol=| delims=" %%F in ('
    findstr /M /I /C:"X" "%USERPROFILE%\Desktop\New_Folder\New_Folder\*.txt"
') do (
    copy "%%F" "%USERPROFILE%\Desktop\New_Folder\"
)

这会复制所有包含文字搜索字符串的文件(以不区分大小写的方式)。

这个批处理文件可以解决问题(-_°)

那么,试试看吧:ScanfilesWordSearch_X.bat

@ECHO OFF
::******************************************************************************************
Title Scan a folder and store all files names in an array variables
SET "ROOT=%userprofile%\Desktop"
Set "NewFolder2Copy=%userprofile%\Desktop\NewCopyTxtFiles"
SET "EXT=txt"
SET "Count=0"
Set "LogFile=%~dp0%~n0.txt"
set "Word2Search=X"
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"
    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% + 20
set /a lines=%Count% + 10
Mode con cols=%cols% lines=%lines%
ECHO  **********************************************************
ECHO  Folder:"%ROOT%"
ECHO  **********************************************************
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(
echo    Type the number of file that you want to explore 
echo(
echo        To save those files just hit 'S' 
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
::*************************************************************
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "mystring=x"
FOR %%a IN ("%sourcedir%\*.txt") DO FINDSTR "%mystring%" "%%a">nul&IF NOT ERRORLEVEL 1 FINDSTR "%mystring%" "%%a">"%destdir%\%%~nxa"

GOTO :EOF

您需要更改 sourcedirdestdir 的设置以适合您的情况并适当设置 mystring,请注意您可能需要调整 findstr切换到适应大小写、文字和 space-in-target-string.

当然,您可以直接将 sourcedir 等编码为文字,但这样做意味着相关字符串只需在一处更改。