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的行。如果将MARKED参数提供给copyMarkedConent.bat命令,则可以保证destFile具有包含INSERT_HERE的行。

有没有办法在 Windows(Windows 7 或 Windows 2008)上使用 .bat 脚本执行此操作,只使用操作系统附带的那些工具?

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.

编辑 1:我进行了不区分大小写的检查,<!-- MARK并且不依赖于之前没有空格。<!-- INSERT

编辑 2:我崩溃了,实际上开始测试我的更改。我进行了一些更改以确保保留缩进和其他格式,并且脚本在我的 Win 7 机器上成功测试。

于 2013-02-11T15:30:42.023 回答