Powershell 根据服务器名称获取服务名称

Powershell 根据服务器名称获取服务名称,powershell,xml-parsing,Powershell,Xml Parsing,我正在编写一个简单的PowerShell脚本,以获取本地和远程服务器的服务状态。我正在从我创建的XML文件中读取服务器和服务: 服务器1 1. 服务1 1. 服务2 2. 这是我的密码: $xml=[xml]获取内容$args 函数readServersfromXML{ $xml.Settings.Server |选择-ExpandProperty名称 } 函数readServerServicesfromXML$server{ $server $xml.Settings.Server.Servi

我正在编写一个简单的PowerShell脚本,以获取本地和远程服务器的服务状态。我正在从我创建的XML文件中读取服务器和服务:

服务器1 1. 服务1 1. 服务2 2. 这是我的密码:

$xml=[xml]获取内容$args 函数readServersfromXML{ $xml.Settings.Server |选择-ExpandProperty名称 } 函数readServerServicesfromXML$server{ $server $xml.Settings.Server.Services.Service |其中{$\ eq$Server} } 函数getServiceStatus$server$service{ 获取服务-Name$Service-ComputerName$server } $servers=readServersfromXML 循环configxml并获取服务的状态 foreach$服务器,在$服务器中{ $services=readServerServicesfromXML$server foreach$服务在$服务中{ getServiceStatus$服务器$服务 } }
起作用的是$servers散列正在填充,但是$services散列没有,我不知道为什么。我的假设是readServerServicesfromXML函数没有找到路径,但我不知道为什么。有人能给我指出正确的方向,或者提供更好的方法吗?最终,我将使用此脚本以XML文件指定的特定顺序远程启动服务,因此使用startOrder XML标记。

稍作修改后,您的代码运行良好:

readServerServicesfromXML函数:

function readServerServicesfromXML ( $server ) {
    $xml.Settings.Server |
        Where-Object {$_.Name -eq $server} |
            Select-Object -ExpandProperty Services
}
嵌套的foreach循环:

foreach ( $service in $services.ChildNodes ) {
    getServiceStatus $server $service.Name
}
节点永远不等于服务器名称,因此此表达式的计算结果始终为$null。因此,该函数只返回上述行之前$server语句输出的服务器名称列表

使用条件XPath表达式根据另一个节点的值选择节点:

function readServerServicesfromXML ($server) {
    $xml.SelectNodes("/Settings/Server[Name='$server']/Services/Service") |
        Select-Object -Expand Name
}

这很有魅力。我很惊讶,我离我所寻找的解决方案不远。感谢beatcracker对我的代码进行了调整。
function readServerServicesfromXML ($server) {
    $xml.SelectNodes("/Settings/Server[Name='$server']/Services/Service") |
        Select-Object -Expand Name
}