Powershell 命令 -- 添加属性(如果 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">
  • 我的文件有很多以单词"添加名称"开头的行。
  • 我想检查这些行是否有字符串"managedRuntimeVersion"。
  • 如果不存在,那么我需要将托管运行时版本="v2.0" 添加到 那条线。

预期成果如下

<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">

我已经尝试过使用以下脚本..但是在结果中..仅给出了具有"添加名称"的行

$sfile="C:Userssubash.sDesktopbackuppool.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">

为了Pete的缘故,配置文件是XML,而不是文本文件!将其编辑为XML文档,您将省去很多麻烦。

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

# 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>

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

最新更新