gpt4 book ai didi

xml - 如何在对象中列出 Powershell 中复杂 xml 中的两个元素

转载 作者:行者123 更新时间:2023-12-05 03:17:08 24 4
gpt4 key购买 nike

  • 我正在尝试创建一个包含计算机名称及其相关 IP 地址的对象
  • 我有以下 XML 将我的所有计算机映射到它们的 ip:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<hq>
<dbs>
<db>
<ip>153.77.162.62</ip>
<cn>SRRAALABJHQDB</cn>
</db>
</dbs>
<mbs>
<mb>
<ip>153.77.162.63</ip>
<cn>SRRAALABJHQRBT</cn>
</mb>
</mbs>
<apps>
<app>
<ip>153.77.162.61</ip>
<cn>SRRAALABJHQIIS</cn>
</app>
</apps>
<sts>
<st>
<dbs>
<db>
<ip>153.77.162.64</ip>
<cn>SRRAALABJST1</cn>
</db>
</dbs>
<mbs>
<mb>
<ip>153.77.162.64</ip>
<cn>SRRAALABJST1</cn>
</mb>
</mbs>
<apps>
<app>
<ip>153.77.162.64</ip>
<cn>SRRAALABJST1</cn>
</app>
</apps>
<poss>
<pos>
<dbs>
<db>
<cn>DTRAALABJPOS1</cn>
</db>
</dbs>
<apps>
<app>
<ip>153.77.162.66</ip>
<cn>DTRAALABJPOS1</cn>
</app>
</apps>
</pos>
<pos>
<dbs>
<db>
<cn>DTRAALABJPOS2</cn>
</db>
</dbs>
<apps>
<app>
<ip>153.77.162.67</ip>
<cn>DTRAALABJPOS2</cn>
</app>
</apps>
</pos>
</poss>
</st>
<st>
<buid>100</buid>
<dbs>
<db>
<ip>153.77.162.65</ip>
<cn>SRRAALABJST2</cn>
</db>
</dbs>
<mbs>
<mb>
<ip>153.77.162.65</ip>
<cn>SRRAALABJST2</cn>
</mb>
</mbs>
<apps>
<app>
<ip>153.77.162.65</ip>
<cn>SRRAALABJST2</cn>
</app>
</apps>
<poss>
<pos>
<dbs>
<db>
<cn>DTRAALABJPOS3</cn>
</db>
</dbs>
<apps>
<app>
<ip>153.77.162.68</ip>
<cn>DTRAALABJPOS3</cn>
</app>
</apps>
</pos>
</poss>
</st>
</sts>
</hq>
  • 我需要创建一个对象来保存值(cn 是 Computer Name 的缩写)

  • 我尝试了以下脚本来创建这样一个对象:

$path = "C:\lab_j.xml"
[xml] $lab = Get-Content -Path $Path


$vms = $lab | Select-Xml "//cn" | ForEach-Object { $_.Node.InnerText } | Select-Object -Unique
$ips = $lab | Select-Xml "//ip" | ForEach-Object { $_.Node.InnerText } | Select-Object -Unique

$vmObject = New-Object PSObject


Foreach ($vm in $vms) {

if ([bool]($vmObject.psobject.Properties | where { $_.Name -eq "name"})) {
$vmObject.name = $vm
}
else
{
$vmObject | Add-Member -MemberType NoteProperty -Name 'name' -Value $vm -Force
}
}

Foreach ($ip in $ips) {

if ([bool]($vmObject.psobject.Properties | where { $_.Name -eq "ip"})) {
$vmObject.ip = $ip
}
else
{
$vmObject | Add-Member -MemberType NoteProperty -Name 'ip' -Value $ip -Force
}
}
  • $vmObject 的输出只给出一个“条目”:
PS C:\Users\hiddai> $vmObject

name ip
---- --
DTRAALABJPOS3 153.77.162.68

代替:

PS C:\Users\hiddai> $vmObject

name ip
---- --
SRRAALABJHQDB 153.77.162.62
SRRAALABJHQRBT 153.77.162.63
SRRAALABJHQIIS 153.77.162.61
SRRAALABJST1 153.77.162.64
DTRAALABJPOS1 153.77.162.66
DTRAALABJPOS2 153.77.162.67
SRRAALABJST2 153.77.162.65
DTRAALABJPOS3 153.77.162.68
  • 是否有创建此类对象的简短方法?

最佳答案

the output of $vmObject give only one "entry":

那是因为您只创建了 1 个对象,然后不断覆盖它的值。

Is there a short and simple way to create such an object?

是的,您可以使用单个 XPath 查询来查找任何具有 <cn> 的 XML 元素和一个 <ip>子节点,然后使用 Select-Object 创建结果对象:

$lab.SelectNodes('//*[./cn and ./ip]') |Select-Object @{Name='Name';Expression='cn'},@{Name='IP';Expression='ip'}

关于xml - 如何在对象中列出 Powershell 中复杂 xml 中的两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74276787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com