Найти строку в каждом файле папки с циклом for - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь найти строку "blabla" внутри файла. Если я найду строку, я заменю ее на «bloblo», если не сделаю ничего. И я хочу сделать эту операцию для всех файлов, которые у меня есть в папке.

Когда я применяю скрипт к одному файлу, он работает хорошо. Когда я использую цикл for, он не работает. он не входит в цикл for

Вот мой сценарий:

    set "Var1=blabla"
    set "Var2=bloblo"

FOR %%i IN (C:\Users\UserName\Desktop\TEST\*.txt) DO (      
        find /c "%Var1%" %%i
        if %errorlevel% equ 1 goto notfound
        call PathFile\FUNCTION_REPLACE.cmd %Var1% %Var2% %%i

        :notfound
)

Я использую скрипт «Function_replace» для замены значений, вот скрипт:

SetLocal EnableExtensions DisableDelayedExpansion

Set "search=%~1"
Set "replace=%2"
Set "File=%3"

For /F "Tokens=1*Delims=]" %%A In ('Find /V /N ""^<"%File%"^&Break^>"%File%"'
)Do (Set "line=%%B"
    SetLocal EnableDelayedExpansion
    (If Not "%%B"=="" (Echo(!line:%search%=%replace%!)Else Echo()>>"%File%"
    EndLocal)

Раньше я использовал прямой вызов моей функции замены для каждого файла в моей папке. Но это занимает много времени, чтобы войти в каждый файл. Вот почему я хочу проверить перед каждым входом в каждый файл, существует ли строка (с помощью find /c).

Вы можете определить, откуда возникла проблема?

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Основываясь на вашем последнем редактировании, вот пример, который отправляет только файлы, содержащие заменяемую строку, в подфункцию:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "search=%~1"
Set "replace=%~2"
For /F Delims^=^ EOL^= %%A In ('FindStr /LIMP "%search%" *.*')Do Call :Sub "%%A"
GoTo :EOF

:Sub
Set "File=%~1"
For /F "Tokens=1*Delims=]" %%A In ('Find /V /N ""^<"%File%"^&Break^>"%File%"'
)Do (Set "line=%%B"
    SetLocal EnableDelayedExpansion
    (If Not "%%B"=="" (Echo(!line:%search%=%replace%!)Else Echo()>>"%File%"
    EndLocal)

Обратите внимание, что команда FindStrиспользует только примерные параметры, в то время как параметр /M важен для этого решения, вы должны проверить выходные данные из FindStr /?, чтобы определить, какие из остальных вы считаете наиболее подходящими.

0 голосов
/ 17 мая 2019

Почему бы просто не перечислить все файлы, в которых есть строка, и исключить файлы, в которых ее нет? Это кажется мне более очевидным планом:

@echo off
set "search=blabla"
for /f "delims=" %%i in ('findstr /m %search% "%USERPROFILE%\Desktop\TEST\*.txt"') do (
  echo found "%search%" in "%%~fi"
)

Если вы все еще хотите показывать файлы, которые не содержат путь, тогда @stephan уже опубликовал комментарий о том, как, нет необходимости повторять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...