batch file从多个文件夹中的多个文件中删除某些string

我有一个文件夹有许多子文件夹,每个子文件夹包含数十个不同长度的.mht文件。 我需要帮助创build一个批处理脚本来筛选出这个特定的string:

 "</BODY></HTML>" 

我可以添加行的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 ) 

有没有什么办法来解决我当前的脚本,或者你知道任何更简单的方法来做到这一点?

注意 :我试图把除了不需要的string之外的所有东西都拷贝到一个临时文件中,但是前面的11行包含特殊字符: | , . :

更新

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


限制

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

笔记

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

    set "_=%_: 搜索项 = 替换项 %"

新的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. 百分号%字符不能在搜索词或替换词中使用。

笔记

  1. 行不能包含奇数的双引号"所以我加倍双引号""以确保偶数,这意味着如果你在字符串中有引号来匹配,它们也必须加倍(不适用于你的场景)
  2. for /f %%S in ('echo "%xLine%"^| find /i "</body>"') do ( !感叹号会导致问题。

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如果您想用新文件替换旧文件,只需从delren命令之前删除rem命令即可。