- 我正在尝试创建一个对象,该对象将保存计算机名称及其相关的IP地址
- 我有以下XML,可以将我的所有计算机与其IPMap:
<?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是计算机名的缩写)
- 我尝试了以下脚本来创建这样的对象:
$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
- 有没有一种简单快捷的方法来创建这样的对象?
1条答案
按热度按时间cigdeys31#
$vmObject的输出只给出了一个“条目”:
这是因为您只创建了一个对象,然后不断地覆盖它的值。
有没有一种简单快捷的方法来创建这样的对象?
可以,您可以使用单个XPath查询来查找任何具有
<cn>
和<ip>
子节点的XML元素,然后使用Select-Object
创建结果对象: