WiX:XML命令中的Powershell变量

时间:2013-12-02 22:36:19

标签: xml variables powershell wix

我正在尝试创建一些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:level。定义。

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命令?

1 个答案:

答案 0 :(得分:0)

我会使用递归函数。如果您有一个固定的深度,则可以通过每次递归调用递减$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'