使用for循环在文件夹的每个文件中查找字符串

时间:2019-05-17 13:16:51

标签: batch-file for-loop find

我尝试在文件内找到字符串“ 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)

过去,我直接对我文件夹中的每个文件使用replace函数的调用。但是进入每个文件需要很长时间。这就是为什么我要在进入每个文件之前检查字符串是否存在(通过使用find / c)。

您能找出问题的根源吗?

2 个答案:

答案 0 :(得分:1)

根据您的最新编辑,下面是一个示例,该示例仅将包含要替换的字符串的文件发送到子功能:

@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 /?的输出以确定哪个。其他您认为最合适的。

答案 1 :(得分:0)

为什么不简单地列出所有包含字符串的文件,而排除没有字符串的文件呢?对我来说,这似乎是一个更明显的计划:

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

如果您仍要显示不包含路径的文件,则@stephan已经发布了有关如何操作的注释,无需我重复。