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