windows - 批量替换参数值

标签 windows batch-file

我正在尝试创建一个用于修改 xml 文件的脚本。 在这个 xml 文件中,我有一些像这样的行:

<tag parameter="value" versionNumber="2.0.3" anotherParameter="value">

我想用新的值替换 versionNumber 的值。

我对不同的线路没有任何问题,但我在值(value)变化方面遇到了困难。 有任何想法吗? 我不会使用任何额外的脚本或工具,只是批处理。

提前致谢

最佳答案

这是一个纯粹的解决方案(让我们称之为 change-version.bat ):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define constants here:
set "XML_FILE=.\sample.xml"
set "TAG_NAME=tag"
set "PAR_NAME=versionNumber"
set "PAR_NEW_VAL="3.2.1""

for /F usebackq^ delims^=^ eol^= %%L in ("%XML_FILE%") do (
    set "LINE=%%L"
    for /F "tokens=1,* delims=< eol=<" %%D in ("%%L") do (
        set "PRE=%%D" & set "LIN=%%E"
        if not defined LIN (set "PRE=" & set "LIN=%%D")
        setlocal EnableDelayedExpansion
        for /F "tokens=1,* eol= " %%F in ("!LIN!") do (
            setlocal DisableDelayedExpansion
            set "INT=%%F" & set "TAG=%%G"
            setlocal EnableDelayedExpansion
            if /I "!INT!"=="%TAG_NAME%" (
                for /F "tokens=1,* delims=> eol=>" %%T in ("!TAG!") do (
                    setlocal DisableDelayedExpansion
                    set "TAG=%%T" & set "END=%%U"
                    call :SUB NEW TAG
                    setlocal EnableDelayedExpansion
                    echo(!PRE!^<%TAG_NAME%!NEW!^>!END!
                    endlocal
                    endlocal
                )
            ) else (
                echo(!LINE!
            )
            endlocal
            endlocal
        )
        endlocal
    )
)

endlocal
exit /B


:SUB var_new var_tag
set "%~1="
:LOOP
setlocal EnableDelayedExpansion
for /F "tokens=1,* eol= " %%P in ("!%~2!") do (
    endlocal
    for /F "tokens=1,* delims== eol==" %%V in ("%%P") do (
        if /I "%%V"=="%PAR_NAME%" (
            set "PAR=%%V=%PAR_NEW_VAL%"
        ) else (
            set "PAR=%%V=%%W"
        )
    )
    set "%~2=%%Q"
    setlocal EnableDelayedExpansion
)
for /F delims^=^ eol^= %%S in ("!%~1! !PAR!") do (
    endlocal & set "%~1=%%S"
)
if defined %~2 goto :LOOP
exit /B

为此,XML 数据必须满足以下条件:

  • 包含标签 <tag> 的行不包含任何其他 XML 标签;
  • 标签<tag>包含参数versionNumber不得跨越多行;
  • 参数定义不得在 = 周围包含空格标志;
  • (引用的)参数值不得包含 <也不>字符;
  • 标签和参数名称均不区分大小写;

该脚本解析 XML 文件 sample.xml在当前目录中。
要将结果写入文件而不是控制台,请像这样重定向它:

"change-version.bat" > "result.xml"

关于windows - 批量替换参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36917603/

相关文章:

windows - 在 Windows 上安装 NERDTree

sql-server - 拒绝访问来自 Visual Studio 2013 数据连接的 Sql Server mdf 文件

batch-file - 使用bat脚本写入文本文件: missing character

windows - 批量重新打开文件

windows - 我的世界服务器需要批量自动重启脚本

c++ - OpenGL(在 Qt 中)- 旋转问题

windows - 使用 maven 部署 github 站点时出错

windows - 有MAKELONGLONG函数吗?

for-loop - 批处理两个 for 循环以从两个不同的文本文件中获取数据

r - 使用批处理文件在 R studio 中执行 R 脚本