2015-11-02 259 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 
}