首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell命令--如果在XML的特定节点中不存在属性,则添加属性

Powershell命令--如果在XML的特定节点中不存在属性,则添加属性
EN

Stack Overflow用户
提问于 2020-06-07 18:57:02
回答 1查看 220关注 0票数 0
代码语言:javascript
复制
<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">

  • I文件中有许多以单词"add“开头的行。
  • 我想检查这些行是否存在字符串
  • ,然后我需要在该行中添加managedRuntimeVersion="v2.0”。

预期结果如下:

代码语言:javascript
复制
<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“的行。

代码语言:javascript
复制
$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"

上面的脚本。我的成绩低于..。

代码语言:javascript
复制
<add name="Classic" autoStart="true" managedRuntimeVersion="v2.0">
<add name="GetServiceDet" autoStart="true" managedRuntimeVersion="v2.0">
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 05:45:32

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

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

代码语言:javascript
复制
# 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>

读取实际文件和将更改保存到磁盘是留给读者的练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62250193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档