【问题标题】:Update the xml using batch scripting使用批处理脚本更新 xml
【发布时间】:2017-07-26 16:56:15
【问题描述】:

我有一个文件 config.xml,其中包含:

<option name="cfgFileVersion" value="18.0-1" />
<option name="inclLifecyclesFrom" value="B" />
<option name="modifyLifecyclesFrom" value="D" />
<option name="adaptDir" value="C:\work\adaptDir"/>
<option name="sourceDir" value="C:\extra\IMSCL1800500.000"/>

我需要替换在同一个配置文件中

<option name="cfgFileVersion" value="18.0-1" />

与:

<option name="cfgFileVersion" value="18.0.2" />

和:

<option name="adaptDir" value="C:\work\adaptDir"/>

与:

<option name="adaptDir" value="New Value 1"/>

和:

<option name="sourceDir" value="C:\extra\IMSCL1800500.000"/>

与:

<option name="sourceDir" value="New Value 2"/>

请帮忙。

【问题讨论】:

  • 现在,在您告诉我们您想要什么之后:您的问题是什么?目前,您的帖子只不过是一个代码请求,这显然是题外话。请阅读tour 并学习How to Ask!顺便说一句,如果你真的有一个配置文件,为什么不手动编辑呢?

标签: xml windows batch-file


【解决方案1】:

将 XML 和其他结构化标记解析为分层对象几乎总是比作为平面文本更容易破解和抓取。不幸的是,Batch 语言没有提供对象或方法来以这种方式本地处理 XML。

但是,您可以使用 PowerShell 脚本轻松完成。

$fr = @{
    "cfgFileVersion" = "18.0.2"
    "adaptDir" = "New Value 1"
    "sourceDir" = "New Value 2"
}

[xml]$xml = gc config.xml

$fr.Keys | %{
    $xml.SelectSingleNode("//option[@name='$_']").setAttribute("value", $fr[$_])
}

$xml.Save("config.xml")

应该使用 .ps1 扩展名保存。如果您必须以 .bat 脚本的形式使用它,您可以将其插入到顶部($fr = 行之前)并将其保存在 .bat + PowerShell 多语言中.bat 扩展名:

<# : batch portion
@echo off & setlocal

powershell -noprofile "iex (${%~f0} | out-string)"
exit /b

: end batch / begin PowerShell #>

编辑:这是一个完整示例,演示了在批处理中分配变量值并在 PowerShell 中检索这些值。

<# : batch portion
@echo off & setlocal

set "cfgVer=18.0.2"
set "adaptDir=New Value 1"
set "sourceDir=New Value 2"

powershell -noprofile "iex (${%~f0} | out-string)"
exit /b

: end batch / begin PowerShell #>

$fr = @{
    "cfgFileVersion" = $env:cfgVer
    "adaptDir" = $env:adaptDir
    "sourceDir" = $env:sourceDir
}

[xml]$xml = gc config.xml

$fr.Keys | %{
    $xml.SelectSingleNode("//option[@name='$_']").setAttribute("value", $fr[$_])
}

$xml.Save("config.xml")

或者,如果您希望完全摆脱哈希表,而是抓取一种在 Batch 中定义的关联数组,也可以这样做。

<# : batch portion
@echo off & setlocal

set "config[cfgFileVersion]=18.0.2"
set "config[adaptDir]=New Value 1"
set "config[sourceDir]=New Value 2"

powershell -noprofile "iex (${%~f0} | out-string)"
exit /b

: end batch / begin PowerShell #>

[xml]$xml = gc config.xml

gci env: | ?{ $_.Name -match "^config\[(.+)\]$" } | %{
    $xml.SelectSingleNode("//option[@name='$($matches[1])']").value = $_.Value
}

$xml.Save("config.xml")

【讨论】:

  • 您好,非常感谢您的回复。但问题是,我只在 .bat 脚本中需要它。不在电源外壳中。因为新值 1 新值 2 是存储在变量 %a% , %b% 中的值。
  • @MKMS 所以包括多语言的东西。您可以使用 $env 范围从 Powershell 中直接引用批处理线程定义的环境变量。批处理中设置的%a% 在PowerShell 中检索为$env:a%b% 变为$env:b%adaptDir% 变为$env:adaptDir,依此类推。请参阅答案编辑。如果您能够使用我的答案来实现您的目标,请考虑将其标记为已接受。 See this page 解释为什么这很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多