Powershell 命令——如果某个属性不存在于 XML 的特定节点中,则添加该属性

Powershell command -- To add a attribute if not exist in a particular node of a XML

<APPPOOL APPPOOL.NAME="Classic" RuntimeVersion="v2.0" state="Started">
<add name="Classic" autoStart="true" managedRuntimeVersion="v2.0">
<APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
<add name="GetServiceDet" autoStart="true">

预期结果如下

<APPPOOL APPPOOL.NAME="Classic" RuntimeVersion="v2.0" state="Started">
<add name="Classic" autoStart="true" managedRuntimeVersion="v2.0">
<APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
<add name="GetServiceDet" autoStart="true" managedRuntimeVersion="v2.0">

我试过下面的脚本..但结果..它只给出了具有"add name"

的行
$sfile="C:\Users\subash.s\Desktop\backup\pool.xml"
(((gc "$sfile") | Select-String -Pattern "add name" | 
select-string -notmatch "managedRuntimeVersion") -replace '>',' managedRuntimeVersion="v2.0">') | 
Set-Content "$sfile"

用上面的脚本。我得到了以下结果..

<add name="Classic" autoStart="true" managedRuntimeVersion="v2.0">
<add name="GetServiceDet" autoStart="true" managedRuntimeVersion="v2.0">

看在皮特的份上,配置文件是 XML,不是文本文件!将其编辑为 XML 文档,您将省去很多麻烦。

有几种方法可以将属性添加到此类文档中。由于问题中的 XML 是一个片段 - 并且是非法语法,示例代码使用了相同的修改版本。 Select 所有 add 没有 managedRuntimeVersion 属性的节点,创建一个并向节点添加具有值的属性。像这样,

# Dummy data for testing
[xml]$x = @'
<root>
<APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
<add name="GetServiceDet2" autoStart="true"/>
</APPPOOL>
<APPPOOL APPPOOL.NAME="Classic" RuntimeVersion="v2.0" state="Started">
<add name="Classic" autoStart="true" managedRuntimeVersion="v2.0" />
</APPPOOL>
<APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
<add name="GetServiceDet" autoStart="true"/>
</APPPOOL>
</root>
'@

# Select all add elements that don't have managedRuntimeVersion attribute
$nl=$x.SelectNodes('/root/APPPOOL/add[not(@managedRuntimeVersion)]')
# Add attributes to the elements
foreach($n in $nl) { 
  # Create new attribute and assign a value
  $a = $x.CreateAttribute('managedRuntimeVersion')
  $a.Value = 'v2.0'
  [void]$n.Attributes.Append($a) 
}

# Print modified version to console
$x.save([console]::out)

# Output
<?xml version="1.0" encoding="ibm850"?>
<root>
  <APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
    <add name="GetServiceDet2" autoStart="true" />
  </APPPOOL>
  <APPPOOL APPPOOL.NAME="Classic" RuntimeVersion="v2.0" state="Started">
    <add name="Classic" autoStart="true" managedRuntimeVersion="v2.0" />
  </APPPOOL>
  <APPPOOL APPPOOL.NAME="GetServiceDet" RuntimeVersion="v2.0" state="Started">
    <add name="GetServiceDet" autoStart="true" managedRuntimeVersion="v2.0" />
  </APPPOOL>
</root>

读取实际文件并将更改保存到磁盘留作 reader 的练习。