1

ソースファイルには次のものがあります。

...
<!-- MARK_BEGIN -->
some text line 1
some text line 2
...
<!-- MARK_END -->
...

上記のマークされたコンテンツを、開始/終了マークなしで、宛先ファイルの最初、最後、または次のようにマークされた場所にコピーしたいと考えています。

...
<!-- INSERT_HERE -->
...

コマンドは次のようになります。

copyMarkedContent.bat sourceFile destFile [TOP | BOTTOM | MARKED ]

sourceFileには、MARK_BEGINMARK_ENDを含む行があることが保証されています。copyMarkedConent.batコマンドにMARKED引数が指定されている場合、destFileにはINSERT_HEREを含む行があることが保証されます

Windows (Windows 7 または Windows 2008) で .bat スクリプトを使用して、OS に付属の機能だけを使用してこれを行う方法はありますか?

4

1 に答える 1

1

私はこれをテストしていませんが、あなたが探しているものを実行すると思います。エラーがあれば、少なくとも開始できます。

@echo off
setlocal enabledelayedexpansion
if #%3==# goto usage

:: convert %3 to upper case
for /f "tokens=5" %%I in ('find "" "%3" 2^>^&1') do set arg=%%I
for %%I in (TOP BOTTOM MARKED) do (if "%arg%"=="%%I" goto next)

:usage
echo usage: %~nx0 sourceFile destFile [TOP^|BOTTOM^|MARKED]
goto :EOF

:next
set /p I="Scraping data from %1... "<NUL
set tempfile=~%time::=%.txt
set tempfile=%tempfile: =%
set tag=0
for /f "tokens=1,2* delims=:" %%H in ('findstr /n ".*" %1') do (
    if not "%%J"=="" (set line=%%I:%%J) else (set line=%%I)
    if !tag!==1 (
        for /f "tokens=*" %%x in ('echo "!line!" ^| find /i "<!-- mark"') do (
            echo Done.
            goto %arg%
        )
        if "!line!"=="" (echo;>>%tempfile%) else (echo !line!>>%tempfile%)
    )
    for /f "tokens=*" %%x in ('echo "!line!" ^| find /i "<!-- mark"') do set tag=1
)

:TOP
set /p I="Prepending data to %2... "<NUL
type %2>>%tempfile%
move /y %tempfile% %2 >NUL
echo Done.
goto :EOF

:BOTTOM
set /p I="Appending data to %2... "<NUL
type %tempfile%>>%2
del /q %tempfile%
echo Done.
goto :EOF

:MARKED
set /p I="Inserting data into %2... "<NUL
set tag=0
set tempfile2=~%time::=%_2.txt
set tempfile2=%tempfile2: =%
for /f "tokens=1,2* delims=:" %%H in ('findstr /n ".*" %2') do (
    if not "%%J"=="" (set line=%%I:%%J) else (set line=%%I)
    if "!line!"=="" (echo;>>%tempfile2%) else (echo !line!>>%tempfile2%)
    if !tag!==0 (
        for /f "tokens=*" %%x in ('echo "!line!" ^| find /i "<!-- insert"') do (
            set tag=1
            type %tempfile%>>%tempfile2%
            del /q %tempfile%
        )
    )
)
move /y %tempfile2% %2 >NUL
echo Done.

EDIT 1 :<!-- MARK大文字と<!-- INSERT小文字を区別せず、以前にスペースがないことに依存しないようにチェックを行いました。

EDIT 2:私は故障し、実際に変更のテストを開始しました。インデントやその他の書式設定が保持されるようにいくつかの変更を加え、Win 7 マシンでスクリプトのテストが成功しました。

于 2013-02-11T15:30:42.023 に答える