如何使用powershell更改DTSX xml文件中的多个节点

时间:2013-08-28 09:18:12

标签: xml powershell powershell-v2.0

我想执行以下操作:选择Configuration个节点,并根据ObjectName值更改ConfigurationString节点值。

XML如下:

<DTS:Executable xmlns:DTS="www.microsoft.com/.." DTS:ExecutableType="SSIS.Package">  
  <DTS:Configuration>
    <DTS:Property DTS:Name="ConfigurationType">1</DTS:Property>
    <DTS:Property DTS:Name="ConfigurationString">change me</DTS:Property>
    <DTS:Property DTS:Name="ObjectName">Configuration_1</DTS:Property>
    <DTS:Property DTS:Name="DTSID">{..}</DTS:Property>
  </DTS:Configuration>
  <DTS:Configuration>
    <DTS:Property DTS:Name="ConfigurationType">1</DTS:Property>
    <DTS:Property DTS:Name="ConfigurationString">me to please</DTS:Property>
    <DTS:Property DTS:Name="ObjectName">Configuration_2</DTS:Property>
    <DTS:Property DTS:Name="DTSID">{..}</DTS:Property>
  </DTS:Configuration>

当只有一个此类节点的实例时,我有以下代码来更改ConfigurationString。

$item = [xml](Get-Content -Path($item_path))
$item.Executable.Configuration.Property | ? { $_.name -eq 'configurationstring'} | % { $_.'#text' = "text" }
$item.Save( $item_path )

我尝试在? { $_.name -eq 'configurationstring'}添加条件以检查ObjectName是否是所需的条件,但我无法返回Configuration节点并更改{{1}节点值。

我也尝试使用ConfigurationString方法,但它不起作用:

SelectSingleNode

谢谢和问候。

2 个答案:

答案 0 :(得分:0)

使用SelectSingleNode获取父

是一件简单的事情
 $xml.Executable.Configuration | % { $_.property } | # Get all of the properties
  ? { $_.name -eq "ObjectName" -and $_."#text" -eq "Configuration_1" } | #Get the one we are looking for 
  % { $_.selectSingleNode("..").Property } | # Get all of it's sibling properties
  ? { $_.name -eq 'configurationstring'} |   # Get the property we want to change
  % { $_.'#text' = "text" }                  # Update property

这可能不是最干净的,但它应该完成工作。

答案 1 :(得分:0)

    PS C:\> $item.Executable.Configuration | % { $_.ChildNodes.GetEnumerator() } | ? {$_.Name -eq "ConfigurationString"} | % { $_.'#text' = "sometext"}

$item.Save("C:\Scripts\so\dtsx.xml")