批处理文件:读取XML在读取时删除CDATA中的感叹号(!)

时间:2014-01-16 05:17:15

标签: xml batch-file csv

目前,我有script执行以下操作:

  1. 查找特定文件夹
  2. 解压缩所有* .zip文件
  3. 读取包含四列(oldid,oldname,newid,newname)的特定CSV file
  4. 在文件夹(sample.xml
  5. 中递归查找所有* .xml文件
  6. 循环浏览* .xml文件,创建副本(原始bak&潜在修改bak)
  7. 用newid,newname替换oldid,oldname
  8. 如果已修改,则写入XML,删除原始文件,将bak移动到原始文件。
  9. 最后一步是我的问题所在。目前,当批处理文件读取XML文件时,它会丢失感叹号。出口前,样品行是: <url><![CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url> 结果 <url><[CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url>

    如何保持感叹号?

2 个答案:

答案 0 :(得分:2)

展开可能包含!文字的FOR变量时,必须确保未启用延迟扩展。您可以修改:replaceCourseInfo例程以在循环内打开和关闭延迟扩展,而不是在例程顶部打开它。

我同意foxidrive,我不知道修改后的变量是如何被使用的,所以我把它剥离了。

:replaceCourseInfo
    @echo off
    setlocal

    set INTEXTFILE=%~1
    set OUTTEXTFILE=%~1
    copy %INTEXTFILE% %INTEXTFILE%.bak
    copy %INTEXTFILE% %INTEXTFILE%.original.bak
    set BAKFILE=%~1.bak

    if exist "%~1.bak" del /F /Q "%~1.bak"

    REM Walk through XML Lines
    REM @todo Need to prevent losing ! in [!CDATA[
    for /F "delims=" %%U in (%~1) do (
        set LINE=%%U

        setlocal enabledelayedexpansion

        if not "!LINE!" == "!LINE:%~2=!" (
            set LINE=!LINE:%~2=%~3!
        )
        >> "%BAKFILE%" echo.!LINE!

        endlocal
    )

    REM If modified, delete original, copy modified bak as new original
    if NOT "%~2"=="%~3" (
        del /F /Q %~1
        copy %BAKFILE% %~1
    )

goto:eof

我曾经使用FOR / F循环来修改文本文件,但获得所需结果通常很复杂。我编写了foxidrive所说的REPL.BAT脚本,现在我几乎总是使用REPL.BAT而不是FOR / F循环来修改文件。 REPL.BAT更简单,更快捷。

答案 1 :(得分:0)

问题是delayed expansion - 可以解决。

您使用的是以下代码 - modified变量未被明显使用。

如果字符串中存在%~2,您的代码似乎只是将%~3替换为%~2,这可以通过dbenham或REPL.BAT使用SED来完成或VBS search and replace feature

REM Walk through XML Lines
REM @todo Need to prevent losing ! in [!CDATA[
for /F "delims=" %%U in (%~1) do (
    set LINE=%%U

    if not "!LINE!" == "!LINE:%~2=!" (
        set LINE=!LINE:%~2=%~3!
        set modified=!string:%~2=%~3!

    )
    >> "%BAKFILE%" echo. LINE!
)

以下是替换上述代码的REPL.BAT解决方法:

type "%~1" | REPL "%~2" "%~3" L >> "%BAKFILE%"