根据指定的参数id更改XML中的值

时间:2017-07-10 10:31:45

标签: xml batch-file cmd

原始文件(Test.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
    <!--標準項目-->
    <parameters kind="standard">
        <parameter id="a" name="replace">120</parameter>
        <parameter id="b" name="replace">120</parameter>
        <parameter id="c" name="replace">120</parameter>
        <parameter id="d" name="replace">00000001</parameter>
        <parameter id="e" name="replace">1</parameter>
    </parameters>
</root>

CMD脚本

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "old="
    set "new=3" 

    for /f "tokens=3 delims=<>" %%a in (
        'find "e" "C:\Test.xml"'
    ) do set "old=%%a"

    powershell -Command "(gc C:\Test.xml) -replace '%old%', '%new%' | Out-File -encoding ASCII C:\Test.xml"

exit 0

修改后的文件(执行CMD脚本后)

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
    <!--標準項目-->
    <parameters kind="standard">
        <parameter id="a" name="replace">320</parameter>
        <parameter id="b" name="replace">320</parameter>
        <parameter id="c" name="replace">320</parameter>
        <parameter id="d" name="replace">00000003</parameter>
        <parameter id="e" name="replace">3</parameter>
    </parameters>
</root>
  1. 执行CMD脚本后,它不检查指定的id,并在每行中更改了所有值1到3.
  2. 任何人都可以告知CMD脚本中哪些代码有错,以及如何修复它?

1 个答案:

答案 0 :(得分:0)

如果您的源数据保持这样的格式,则以下命令将起作用。我承认,如果源文本发生变化,这很脆弱,但我并不完全了解您的要求。

Get-Content test.xml | ForEach-Object { $_ -replace '(.*id="e".*>).*(</p.*)', '${1}3$2' }

如果源数据文件中包含Shift-JIS字符,则使用-encoding ASCII的可能性不大。