【发布时间】: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