使用PowerShell替换XML变量

时间:2017-07-10 10:18:39

标签: xml powershell

我正在编写PowerShell脚本来自动升级已安装的组件。该文件的配置详细信息存储在XML文件中。由于变量之间存在相互依赖关系,因此变量定义如下。

<root>
    <variable name="APP_NAME", value="My App" />
    <variable name="INSTALL_PATH", value="some folder/${APP_NAME}" />
    <variable name="PRODUCT_HOME" value="${INSTALL_PATH}\productinfo\${APP_NAME}" />
<root>

当我读取XML文件时,我希望将$INSTALL_PATH的值设为some folder/My App而不是some Folder/${APP-NAME}。并且APP_NAME的值在几步之后发生了变化,我不得不再次重新解析XML文件。

最好的方法是什么?

我想过读取XML文件并为XML文件中的每个变量创建PowerShell变量,当我必须重新解析XML文件时,我将更改变量的值。

有没有更好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

如果<variable>节点是“按顺序”,即每个节点仅使用已在先前节点中定义的变量,则可以执行以下操作:

$xml.SelectNodes('//variable') | ForEach-Object {
  New-Variable -Name $_.name -Value $ExecutionContext.InvokeCommand.ExpandString($_.value)
}

否则,您必须先定义变量,然后在第二步中展开嵌套变量:

$nodes = $xml.SelectNodes('//variable')

$nodes | ForEach-Object {
  New-Variable -Name $_.name -Value $_.value
}

$nodes | Select-Object -Expand name | ForEach-Object {
  $var = Get-Variable -Name $_
  $var.Value = $ExecutionContext.InvokeCommand.ExpandString($var.Value)
}

请注意,使用hashtable代替单个变量会使处理变得更加容易。