在PowerShell中使用&符更新XML节点值

时间:2018-03-14 19:17:06

标签: xml powershell

我有一个XML文件,我们称之为Project.params,内容如下:

<div class="container">
<img src="something.png" />
</div>

<div class="container">
<img src="something2.png" />
</div>

我需要使用带有&符号的字符串更新“MyPassword”属性。我尝试了以下代码

.container {
    width: 200px;
    height: 120px;
}

/* resize images */
.container img {
    width: 100%;
    height: auto;
}

我收到以下错误

<?xml version="1.0"?>
<SSIS:Parameters xmlns:SSIS="www.microsoft.com/SqlServer/SSIS">
  <SSIS:Parameter SSIS:Name="MyPassword">
    <SSIS:Properties>
      <SSIS:Property SSIS:Name="ID">{8ff4ab3f-e607-4ccc-adc0-bececa310d17}</SSIS:Property>
      <SSIS:Property SSIS:Name="CreationName">
      </SSIS:Property>
      <SSIS:Property SSIS:Name="Description">
      </SSIS:Property>
      <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Value">ZP</SSIS:Property>
      <SSIS:Property SSIS:Name="DataType">18</SSIS:Property>
    </SSIS:Properties>
  </SSIS:Parameter>
</SSIS:Parameters>

但是,如果我只是从$sourcePath = "C:\Project.params" $Parameters = @{} $key = "MyPassword" #$value = "aabbcc" $value = "aabbcc&" $Parameters.add($key, $value) [xml]$paramxml = Get-Content $sourcePath $paramxml.Parameters.Parameter | ? { $_.Name -eq $key} | % { $parameterxmlnode = $_ $parameterxmlnode.Properties.Property | ? {$_.Name -eq "Value"} | % { $oldval = $_ if ($oldval.InnerText -ne $value) { Write-Host "Updating property" $key "..." $oldval.set_InnerXML($value) $ismodified = $true } } } 变量中删除“&”符号,则一切都按预期工作。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

&需要转义为&amp;,引号和尖括号也是如此。

您可以使用https://stackblitz.com/edit/embedded-routes-without-children-kd1hms为您转义整个字符串:

$escapedValue = [System.Security.SecurityElement]::Escape($value)
$oldval.InnerXML = $escapedValue

...或者,正如@PetSerAl建议的那样,使用适当的属性InnerText(而不是InnerXml),这将自动处理转义:

$oldval.InnerText = $value

答案 1 :(得分:0)

这就是你要找的东西:

[xml]$xml = @'
<?xml version="1.0"?>
<SSIS:Parameters xmlns:SSIS="www.microsoft.com/SqlServer/SSIS">
  <SSIS:Parameter SSIS:Name="MyPassword">
    <SSIS:Properties>
      <SSIS:Property SSIS:Name="ID">{8ff4ab3f-e607-4ccc-adc0-bececa310d17}</SSIS:Property>
      <SSIS:Property SSIS:Name="CreationName">
      </SSIS:Property>
      <SSIS:Property SSIS:Name="Description">
      </SSIS:Property>
      <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Value">ZP</SSIS:Property>
      <SSIS:Property SSIS:Name="DataType">18</SSIS:Property>
    </SSIS:Properties>
  </SSIS:Parameter>
</SSIS:Parameters>
'@
$xml.Parameters.Parameter.Name
$xml.Parameters.Parameter.Name = '&MyPassword'
$xml.Parameters.Parameter.Name