【问题标题】:WiX: Powershell variables in XML commandsWiX:XML 命令中的 Powershell 变量
【发布时间】:2013-12-02 22:36:19
【问题描述】:

我正在尝试创建一些 XML,我正在使用 XML 命令创建目录结构。目录深度(如下图)是可变的。

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles" />
   <Directory Id="subdir1" Name="subdir1">
     <Directory Id="subdir2" Name="subdir2">
       <Directory Id="INSTALLDIR" Name="$(var.Directory)">

Powershell函数代码是这样的。我传入了三个变量,$Id、$Name 和一个 INT $i。 $XMLNS 在 $script: 级别定义。

function WriteDirectory {
    Param(
        [Parameter(Mandatory = $true)][string]$Id,
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $true)][int]$NumDirectories
        )
    $Directories = $null
    for ($i = 0; $i -lt $NumDirectories; $i++) {
        $Directories += "Directory."
    }
    # Trim the trailing dot
    [string]$Directories = $Directories.SubString(0,$Directories.Length-1)
    $NewDirectory = $XML.CreateElement('Directory', $XMLNS)
    $NewDirectory.SetAttribute('Id', $Id)
    $NewDirectory.SetAttribute('Name', $Name)
    $XML.Wix.Product.$Directories.AppendChild($NewDirectory) # This is the problem code
}

Powershell 不喜欢将字符串作为对象的一部分。 $i 可能高达 7,所以最后一个命令基本上是,如果 $i 是 7:

$XML.Wix.Product.Directory.Directory.Directory.Directory.Directory.Directory.Directory.AppendChild($NewDirectory)

我怎样才能轻松地形成最后一个本质上是动态的 XML 命令?

【问题讨论】:

    标签: xml variables powershell wix


    【解决方案1】:

    我会使用递归函数。如果您有固定的深度,您可以在每次递归调用时递减 $NumDirectories

    function AppendDirectory {
      Param(
        [Parameter(Mandatory = $true)]$parentNode,
        [Parameter(Mandatory = $true)][string]$Id,
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $true)][int]$NumDirectories
      )
    
      if ($NumDirectories -eq 0) {
        $NewDirectory = $xml.CreateElement('Directory')
        $NewDirectory.SetAttribute('Id', $Id)
        $NewDirectory.SetAttribute('Name', $Name)
        $parentNode.AppendChild($NewDirectory)
      } else {
        AppendDirectory $parentNode.Directory $Id $Name ($NumDirectories - 1)
      }
    }
    
    AppendDirectory $XML.Wix.Product 'Id' 'Name' 5
    

    或者,如果您想在叶 Directory 节点处追加一个新的 Directory 节点而不考虑深度,您可以执行以下操作:

    function AppendDirectory {
      Param(
        [Parameter(Mandatory = $true)]$parentNode,
        [Parameter(Mandatory = $true)][string]$Id,
        [Parameter(Mandatory = $true)][string]$Name
      )
    
      if ($parentNode.ChildNodes.Count -eq 0) {
        $NewDirectory = $xml.CreateElement('Directory')
        $NewDirectory.SetAttribute('Id', $Id)
        $NewDirectory.SetAttribute('Name', $Name)
        $parentNode.AppendChild($NewDirectory)
      } else {
        AppendDirectory $parentNode.Directory $Id $Name
      }
    }
    
    AppendDirectory $XML.Wix.Product 'Id' 'Name'
    

    【讨论】:

    • 这很棒!我曾尝试过与您的首选类似的东西,但我离得很远,无法让它发挥作用。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2010-10-23
    • 2017-01-16
    • 2019-03-04
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多