如何在一个对象中列出PowerShell中复杂的XML中的两个元素

py49o6xq  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(178)
  • 我正在尝试创建一个对象,该对象将保存计算机名称及其相关的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
  • 有没有一种简单快捷的方法来创建这样的对象?
cigdeys3

cigdeys31#

$vmObject的输出只给出了一个“条目”:
这是因为您只创建了一个对象,然后不断地覆盖它的值。
有没有一种简单快捷的方法来创建这样的对象?
可以,您可以使用单个XPath查询来查找任何具有<cn><ip>子节点的XML元素,然后使用Select-Object创建结果对象:

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

相关问题