【问题标题】:XML variable replacement using PowerShell使用 PowerShell 替换 XML 变量
【发布时间】:2017-07-10 10:18:39
【问题描述】:

我正在编写一个 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 文件时,我将更改变量的值。

有没有更好的方法来实现这一点?

【问题讨论】:

  • 您正在有效地用 XML 编写自己的小型域语言。如果您不以任何方式限制这一点(也就是说,定义以任何顺序出现都是合法的),您必须全力以赴并构造一个 DAG 并对其进行拓扑排序。我强烈建议不要这样做,只允许按顺序定义 - 在这种情况下,您可以摆脱逐行解析文件并维护在每一行上替换的定义哈希。
  • 一个更懒惰但可能有效的替代方法是请求配置成为 PowerShell 对象,您可以从某处的点源脚本中获得。好处是它允许人们完全灵活地构建配置。缺点是它允许人们完全灵活地构建配置——它是需要维护和理解的代码,并且可能具有安全隐患。
  • 最后但并非最不重要(好吧,我猜我应该花时间写一个答案)确保您不会以某种方式重新发明轮子。 PowerShell 中有(半)本机支持以Desired State Configuration 的形式维护组件。对于您的目的而言,它可能有点矫枉过正,或者它可能是一个超越您自己的面向未来的解决方案。
  • @JeroenMostert 感谢您的投入。已检查 Powershell DSC。这对我的要求来说太过分了。我将通过结合 Ansgar 的以下答案与您一起采用第二种方法。

标签: xml powershell


【解决方案1】:

如果&lt;variable&gt; 节点是“有序”的,即每个节点仅使用之前节点中已经定义的变量,您可以执行以下操作:

$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 而不是单个变量往往会使处理更容易。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多