使用Windows批处理脚本在文件夹中的多个文件中查找和替换字符串的一部分

时间:2014-03-07 19:28:55

标签: cmd

我有一个批处理文件,使用Windows批处理脚本在文件夹中的多个文件中查找和替换文件中的文本字符串,但它不起作用,只需将YYY替换为null或无效。任何帮助赞赏。谢谢

@echo off
SETLOCAL
SET stringtofindreplace=YYY
for %%f in (*.fmw) do (
    @echo Processing %%f...
    fOR /F "delims=" %%l IN (%%f) DO (
        SET "line=%%l"
        SET fname=%%~nf
        SET fname=!fname:~6,3!
        SETLOCAL ENABLEDELAYEDEXPANSION 
        set "x=!line:%stringtofindreplace%=%fname%!" 
        echo(!x!
        ENDLOCAL)
    )>%%~nf.txt
)
GOTO:EOF 

这里是更新的代码仍然无法正常工作

@echo off
SETLOCAL
SET stringtofindreplace=YYY
for %%f in (*.fmw) do (
     @echo Processing %%f...
     (
     fOR /F "delims=" %%l IN (%%f) DO (
         SET "line=%%l"
         SET fname=%%~nf
         SETLOCAL ENABLEDELAYEDEXPANSION
         SET fname=!fname:~6,3!
         SET "x=!line:%stringtofindreplace%=%fname%!" 
         echo(!x!
         ENDLOCAL
         )
     )>%%~nf.txt
 )
 GOTO:EOF

1 个答案:

答案 0 :(得分:0)

你有很多问题。

1)您的名字子串计算尝试在启用循环之前使用延迟扩展。

2)使用正常扩展无法扩展计算的替换字符串。你也需要延迟扩张。但是你不能在延迟扩展中使用延迟扩展。诀窍是将内部值传递给FOR变量。

3)ENDLOCAL之后你有一个额外的,不平衡的)。我认为这不会导致您发布的代码出现任何问题,但您可能应将其删除。

您还要为每一行计算一次名称子字符串,而实际上每个文件只需要执行一次。这不是错误,但效率低下。

这是更正后的代码。

@echo off
setlocal
set stringtofindreplace=YYY
for %%f in (*.fmw) do (
  @echo Processing %%f...
  setlocal enableDelayedExpansion
  set "fname=%%~nf"
  for /f "eol=: delims=" %%A in ("!fname:~6,3!") do (
    endlocal
    for /f "delims=" %%l IN (%%f) do (
      set "line=%%l"
      setlocal enableDelayedExpansion 
      set "x=!line:%stringtofindreplace%=%%A!" 
      echo(!x!
      endlocal
    )
  )>"%%~nf.txt"
)

如果任何行以;开头,您仍然会遇到问题。此外,空行将被剥离。这些限制可以通过更多代码来解决。

但即使你修复了限制,它也会很慢。如果任何文件很大,它可能会非常慢。

如果您使用我的hybrid JScript/batch REPL.BAT utility

,代码会更简单,更快速,更可靠
@echo off
setlocal
set stringtofindreplace=YYY
for %%f in (*.fmw) do (
  @echo Processing %%f...
  setlocal enableDelayedExpansion
  set "fname=%%~nf"
  type "!fname!.fmw"|repl "%stringtofindreplace%" "!fname:~6,3!" li >"!fname!.txt"
  endlocal
)