我有一个包含许多子文件夹的文件夹,每个子文件夹包含数十个不同长度的.mht
个文件。我需要帮助创建一个批处理脚本来过滤掉这个特定的字符串:
"</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
)
有没有办法修复我当前的脚本,或者你们中的任何人都知道更简单的方法吗?
注意:我尝试将除了不需要的字符串之外的所有内容复制到临时文件,但前11行包含特殊字符ex:| , . :
答案 0 :(得分:1)
我添加了一个新脚本,该脚本会将所需代码替换为搜索词。该脚本可以处理特殊字符。
]
字符将从行首开始修剪。这不是问题,因为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
如果要用新文件替换旧文件,只需从rem
和{{1}之前删除del
命令。 }命令。