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

时间:2015-11-02 14:54:28

标签: powershell xml-parsing

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

<Settings>
  <Server>
    <Name>Server1</Name>
    <StartOrder>1</StartOrder>
    <Services>
      <Service>
        <Name>Service1</Name>
        <StartOrder>1</StartOrder>
      </Service>
      <Service>
       <Name>Service2</Name>
       <StartOrder>2</StartOrder>
      </Service>
    </Services>
  </Server>
</Settings>

这是我的代码:

$xml = [xml](Get-Content $args)

function readServersfromXML() {
    $xml.Settings.Server | select -ExpandProperty Name
}

function readServerServicesfromXML($server) {
    $server
    $xml.Settings.Server.Services.Service | Where {$_ -eq $server}
}

function getServiceStatus($server, $service) {
    Get-Service -Name $service -ComputerName $server
}

$servers = ( readServersfromXML )
#loop through the configxml and get status of services
foreach ( $server in $servers ) {
    $services = ( readServerServicesfromXML $server )
    foreach ( $service in $services ) {
        getServiceStatus $server $service
    }
}

什么有用$servers散列被填充,但$services散列不是,我不明白为什么。我的假设是readServerServicesfromXML()函数找不到路径,但我不知道为什么。有人能指出我正确的方向,还是提供更好的方法来做到这一点?最终,我将使用此脚本按照XML文件(因此startOrder XML标记)的指示,按特定顺序远程启动服务。

2 个答案:

答案 0 :(得分:1)

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

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
}

答案 1 :(得分:1)

$xml.Settings.Server.Services.Service | Where {$_ -eq $server}

<Service>节点永远不会等于服务器名称,因此该表达式始终计算为$null。因此,该函数只返回服务器名称列表(上述行之前$server语句的输出)。

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

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