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

Batch file 使用for循环在文件夹的每个文件中查找字符串,batch-file,for-loop,find,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 ( fi

我试图在文件中找到字符串“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)
SetLocal EnableExtensions DisableDelayedExpansion
设置“搜索=%~1”
设置“替换=%2”
设置“文件=%3”
对于('Find/V/N”“^“%File%”中的/F“Tokens=1*Delims=]”%%A
)Do(设置“行=%%B”
SetLocal EnableDelayedExpansion
(如果不是“%%B”==”(回显(!行:%search%=%replace%!)否则回显()>%File%
(本地)
我过去常常直接对文件夹中的每个文件调用replace函数。但是进入每个文件需要很长时间。这就是为什么我想在进入每个文件之前检查字符串是否存在(使用find/c)


你能指出问题的来源吗?

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

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

如果您仍希望显示不包含路径的文件,则@stephan已经发布了一条关于如何显示的注释,无需重复。

根据您最近的编辑,以下示例仅将包含要替换字符串的文件发送到子函数:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
设置“搜索=%~1”
设置“替换=%~2”
对于('FindStr/LIMP“%search%”中的/F Delims^=^EOL^=%%A,请调用子“%%A”
后藤:EOF
:Sub
设置“文件=%~1”
对于('Find/V/N”“^“%File%”中的/F“Tokens=1*Delims=]”%%A
)Do(设置“行=%%B”
SetLocal EnableDelayedExpansion
(如果不是“%%B”==”(回显(!行:%search%=%replace%!)否则回显()>%File%
(本地)

<>请注意,<代码> FindStr <代码>命令只使用示例选项,而/M选项对该解决方案非常重要。您应该检查<代码> FordSTR//<代码>的输出,以确定您认为哪个最合适。

您有A。如果循环根本没有执行,则没有匹配的F。噢,而且不能在(命令块)中使用标签。您的示例似乎有点过于简单。如果您在一个文件中搜索字符串,则简单的“已找到”或“未找到”消息可能会很有用。如果您在目录中搜索所有文件,则这些消息没有任何用途,除非每条消息还显示针对该消息搜索的文件。您能解释一下这项任务真的是吗?因为知道这一点将决定最合适的方法,从而为可能的解决方案奠定基础。`findstr/m“blabla”“C:\Users\UserName\Desktop\TEST*.txt”为您提供包含字符串的文件名。这对您有用吗?
对于%%a in(*)do@findstr“E”“%%a”>nul&(echo在%%a中找到)|(在%%a中找不到echo)
也可能有帮助。我提供了有关为什么在for循环中需要这些标签的更多详细信息