【问题标题】:Find a string into each file of a folder with for loop使用 for 循环在文件夹的每个文件中查找字符串
【发布时间】:2019-05-17 13:16:50
【问题描述】:

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

你能找出问题出在哪里吗?

【问题讨论】:

  • 你有一个delayed expansion problem。如果循环根本没有执行,则没有匹配的文件。哦 - 你不能在(命令块)内使用标签。
  • 你的例子似乎有点过于简单了。如果您在一个文件中搜索字符串,那么一条简单的已找到或未找到消息可能会很有用。如果您正在搜索目录中的所有文件,那么这些消息将毫无用处,除非每条消息还显示针对该消息搜索的文件。你能解释一下这个任务到底是什么吗?因为知道这将确定可能的解决方案所依据的最合适的方法。
  • `findstr /m "blabla" "C:\Users\UserName\Desktop\TEST*.txt" 为您提供包含该字符串的文件的名称。这对你有用吗?
  • for %%a in (*) do @findstr "E" "%%a" &gt;nul &amp;&amp; (echo found in %%a) || (echo not found in %%a) 也可能有帮助。
  • 我详细说明了为什么我的 for 循环中需要这些标签

标签: batch-file for-loop find


【解决方案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 /? 的输出以确定您最会考虑哪些其他选项合适。

【讨论】:

    【解决方案2】:

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

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

    如果你还想显示不包含路径的文件,那么@stephan 已经发表了关于如何做的评论,无需我重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多