我正在尝试创建一个用于修改 xml 文件的脚本。 在这个 xml 文件中,我有一些像这样的行:
<tag parameter="value" versionNumber="2.0.3" anotherParameter="value">
我想用新的值替换 versionNumber 的值。
我对不同的线路没有任何问题,但我在值(value)变化方面遇到了困难。 有任何想法吗? 我不会使用任何额外的脚本或工具,只是批处理。
提前致谢
最佳答案
这是一个纯粹的batch-file解决方案(让我们称之为 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/