.bat脚本可以将标记文本从一个文件复制到另一个文件中的标记位置吗?

时间:2013-02-11 13:49:16

标签: batch-file

在源文件中我有:

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

我想将上面标记的内容(没有开始/结束标记)复制到目标文件中,无论是在开头,最后还是标记为:

的位置
...
<!-- INSERT_HERE -->
...

命令是:

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

sourceFile 保证其中包含 MARK_BEGIN MARK_END 的行。如果为 copyMarkedConent.bat 命令提供 MARKED 参数,则 destFile 保证包含 INSERT_HERE 的行

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

1 个答案:

答案 0 :(得分: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机器上成功测试脚本。