我有一个文件夹有许多子文件夹,每个子文件夹包含数十个不同长度的.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行包含特殊字符: | , . :
我已经添加了一个新的脚本,将所需的代码的搜索词替换成行。 该脚本可以处理特殊字符。
]
字符将从行首开始修剪。 不是一个问题,因为HTML中不应该有以这个字符开始的行。 (如果需要,这可以被修复) %
字符不能在搜索词或替换词中使用。 "
所以我加双引号""
来确保偶数,这意味着如果你在任何一个字符串中都有引号,那么它们也必须加倍! 要使用该脚本,只需在下面的代码行中将搜索项和替换项替换为所需内容即可。
set "_=%_:
搜索项 =
替换项 %"
@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
这应该做你想要的。 没有延迟扩展需要。 应该支持所有特殊字符。
]
字符将被修剪。 不是一个问题,因为在HTML中不应该有以括号字符开始的行。 (如果需要,这可以被修复。) %
字符不能在搜索词或替换词中使用。 "
所以我加倍双引号""
以确保偶数,这意味着如果你在字符串中有引号来匹配,它们也必须加倍(不适用于你的场景) for /f %%S in ('echo "%xLine%"^| find /i "</body>"') do (
!
感叹号会导致问题。 @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
如果您想用新文件替换旧文件,只需从del
和ren
命令之前删除rem
命令即可。