1

.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行に特殊文字が含まれています。例:| , . :

4

1 に答える 1

1

アップデート

検索語を目的のコードに置き換える新しいスクリプトを行に追加しました。スクリプトは特殊文字を処理できます。


制限事項

  1. 先頭の閉じ括弧]の文字は、行の先頭からトリミングされます。この文字で始まるHTMLの行はないはずなので、問題はありません。(これは必要に応じて修正できます)
  2. パーセント記号%文字は、検索語または置換語のいずれにも使用できません。

ノート

  1. 行に奇数の二重引用符を含めることはできないため、偶数を確保する"ために二重引用符を2倍にします。""つまり、いずれかの文字列に引用符がある場合は、それらも2倍にする必要があります。
  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倍にします。""つまり、文字列に一致する引用符がある場合は、それらも2倍にする必要があります。(シナリオには適用されません)
  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 ます。古いファイルを新しいファイルに置き換える場合は、 andコマンドremの前からコマンドを削除するだけです。delren

于 2013-01-14T22:31:01.850 に答える