批处理文件从多个文件夹中的多个文件中删除某些字符串

时间:2013-01-14 18:27:31

标签: windows batch-file dos mhtml

我有一个包含许多子文件夹的文件夹,每个子文件夹包含数十个不同长度的.mht个文件。我需要帮助创建一个批处理脚本来过滤掉这个特定的字符串:

"</BODY></HTML>"

我可以在将文件添加回文件之前将添加到文件中。这就是我到目前为止所做的:

setlocal enabledelayedexpansion

for /r %%a in (*.mht) do (
    for /f "skip=11" %%b in (%%a) do (if %%b=="</BODY></HTML>" del %%b)
    echo "stuff to add">>%%a
    echo "</BODY></HTML>">>%%a
)

有没有办法修复我当前的脚本,或者你们中的任何人都知道更简单的方法吗?

注意:我尝试将除了不需要的字符串之外的所有内容复制到临时文件,但前11行包含特殊字符ex:| , . :

1 个答案:

答案 0 :(得分:1)

更新

我添加了一个新脚本,该脚本会将所需代码替换为搜索词。该脚本可以处理特殊字符。


限制

  1. 前导关闭括号 ] 字符将从行首开始修剪。这不是问题,因为HTML中不应该以此字符开头。 (如果需要,可以修复)
  2. 百分号 % 字符不能用于搜索字词或替换字词。
  3. 备注

    1. 行不能包含奇数个双引号 " ,因此我将双引号加倍 "" 以确保偶数。这意味着如果你在任何一个字符串中都有引号,那么它们也必须加倍!
    2. 要使用该脚本,只需将搜索字词替换字词替换为您想要的以下代码行。

      set "_=%_: 搜索字词 = 替换字词 %"

    3. 新Script.bat

      @echo off
      setlocal EnableExtensions DisableDelayedExpansion
      
      :: Limitations
      :: 1. Any leading close bracket ] characters will be trimmed due to delims=].
      
      for /r %%F in (html.txt) do if exist "%%~fF" (
          for /f "tokens=1,* delims=]" %%K in ('type "%%~fF" ^| find /n /v ""') do (
              set "_=%%L"
              call :Expand_
          )
      )
      goto End
      
      
      :Expand_
      :: NULL is a blank line or line with only a close bracket ].
      if not defined _ echo. & goto :eof
      :: Ensure even number of double quotation marks.
      set "_=%_:"=""%"
      :: Inject the code.
      set "_=%_:</body>=<code>To Inject</code></body>%"
      :: Escape batch special characters.
      set "_=%_:^=^^%"
      set "_=%_:<=^<%"
      set "_=%_:>=^>%"
      set "_=%_:&=^&%"
      set "_=%_:|=^|%"
      :: Revert quotations.
      set "_=%_:""="%"
      :: Display
      echo(%_%
      goto :eof
      
      
      :End
      endlocal
      pause >nul
      

      原始

      这应该做你想要的。不需要延迟扩展。应该支持所有特殊字符。

      限制

      1. 前导关闭括号 ] 字符将被修剪。这不是问题,因为HTML中不应该以小括号字符开头。 (如果需要,可以修复此问题。)
      2. 百分号 % 字符不能用于搜索字词或替换字词。
      3. 备注

        1. 行不能包含奇数个双引号 " ,因此我将双引号加倍 "" 以确保偶数。这意味着如果您在字符串中有引号匹配,它们也必须加倍。 (不适用于您的方案)
        2. 无法在此行周围使用延迟展开for /f %%S in ('echo "%xLine%"^| find /i "</body>"') do (其他!感叹号会导致问题。
        3. Script.bat

          @echo off
          setlocal EnableExtensions
          
          for /r %%F in (*.mht) do if exist "%%~fF" (
              rem Limitation - Any leading close bracket ] characters will be trimmed.
              for /f "tokens=1,* delims=]" %%K in ('type "%%~fF" ^| find /n /v ""') do (
                  set "xLine="%%L""
                  call :Match
                  echo(%%L>>"%%~dpF\new_%%~nF%%~xF"
              )
              rem del "%%~fF"
              rem ren "%%~dpF\new_%%~nF%%~xF" "%%~nxF"
          )
          goto End
          
          
          :Match
          setlocal EnableExtensions DisableDelayedExpansion
          rem Double the double quotations to ensure even number of double quotations.
          set "xLine=%xLine:"=""%"
          for /f %%S in ('echo "%xLine%"^| find /i "</body>"') do (
              rem Add your code to inject here.  Copy the template echo below.
              rem Note that special characters need to be escaped.
              echo Inject Code>>"%%~dpF\new_%%~nF%%~xF"
          )
          endlocal
          goto :eof
          
          
          :End
          endlocal
          pause >nul
          

          这会将新文件输出到new_<filename>.mht如果要用新文件替换旧文件,只需从rem和{{1}之前删除del命令。 }命令。