【发布时间】: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" >nul && (echo found in %%a) || (echo not found in %%a)也可能有帮助。 -
我详细说明了为什么我的 for 循环中需要这些标签
标签: batch-file for-loop find