2015-11-02 212 views
1

我正在编写一个简单的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标记)指定的特定顺序远程启动服务。

回答

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 
} 
+0

这就像一个魅力。我很惊讶,我离我正在寻找的解决方案不太远。谢谢beatcracker对我的代码进行调整。 – todd1215

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 
}