2016-09-16 4 views
-1

У меня есть папка со многими .txt файлами. Я бы хотел найти строку "X" во всех этих файлах, тогда я хотел бы скопировать найденные строки в файлы .txt в другую папку.Найти строку в нескольких файлах .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 части это suppost скопировать измененные .txt файлы в новую папку с таким же именем.

Я хотел бы указать, что строка "X" находится в разных местах в файле .txt.

+0

Я не знаю, что такое '%% ~ vc'; введите 'for /?' в окно командной строки и прочитайте справку; нет модификатора '~ v' (не существует цикла' for %% v'). Во всяком случае, ваш код является неполным, так как есть несбалансированные круглые скобки ... И как насчет ввода нескольких символов ваших требований сюда в виде текста, а не предоставления им изображения? – aschipfl

+0

@aschipfl Мне нравится быть творческим. Спасибо за 'for /?' Я возьму squiz. – MALKAVIAN

+0

Насколько мне известно, на изображении отображается не капитализированный ** x **, а не заглавный ** X ** в соответствии с вашим поиском. Кроме того, я бы рассматривал ** x ** как символ, только становясь строкой, если он кажется смежным только с пробелом, (string1 ** x ** string3). Такая информация важна при попытке сформулировать стоящие решения. – Compo

ответ

1
@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 

Вы должны были бы изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами и установите mystring соответствующим образом, отметив, что вам, возможно, придется настроить переключатели findstr для размещения case, literal и space-in-target-string.

Естественно, вы могли бы закодировать sourcedir и т. Д. Непосредственно как литералы, но это означает, что соответствующие строки нужно менять только в одном месте.

0

Вы близки, но проверив ErrorLevel из findstr не имеет смысла здесь, поскольку это отражает общий результат, то есть, ErrorLevel установлен в 0 в случае любой файлы содержат строку поиска.

Я хотел бы разобрать вывод findstr /M используя for /F петли и скопировать возвращаемые файлы в теле:

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\" 
) 

Это копирует все те файлы, которые содержат буквальную строку поиска (в зависимости от регистра) ,

+0

[EDIT] (http://stackoverflow.com/revisions/39534388/2): добавлен '/ I' переключатель для поиска без учета регистра; добавлен '/ C' переключатель для обработки строки поиска как литерал; – aschipfl

+0

просто отметить это то, что OP спросил: «Я бы хотел найти строку« X »во всех этих файлах, тогда я бы хотел скопировать найденные строки в .txt-файлы в другую папку». Образ спросит, что они скопированы «с только строкой x в них». Я предполагаю, что вопрос запрашивает имя файла с совпадающей строкой, подлежащей копированию, но при этом целевой файл будет содержать только соответствующую строку * (s) *. – Compo

+0

@Compo, я согласен, не совсем понятно, что нужно; в любом случае, я копирую все эти файлы, содержащие строку поиска ... – aschipfl

2

Этот пакетный файл может сделал трюк (-_ °)

Так, просто дать попробовать: 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 
::************************************************************* 

 Смежные вопросы

  • Нет связанных вопросов^_^