2017-07-16 64 views
-1

下面的代碼旨在檢查兩個硬編碼的服務名稱(這些名稱永遠不會更改),並且如果它們未找到,則表明服務不存在。它這樣做,但它輸出兩行,因爲有兩個服務來檢查。循環正在複製輸出

有沒有辦法改變這種情況,以便在檢查兩個服務後只給出一個輸出?

$servicenames = ("Service 1", "Service 2") 

Write-Host 'Checking for Services' 

function servicevalidation { 
    foreach ($sn in $servicenames) { 
    if ((Get-Service "$servicenames*" -Include $servicenames) -eq $null) { 
     Write-Host 'Young jedi you are mistaken, this server is not a collector!' 
    } else { 
     Write-Host "$servicenames present" 
    } 
    } 
} 
+0

你不能包括選項一起使用的服務名稱,請參閱[文件](https://開頭MSDN。 microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.management/get-service#default-default)。我相信你想檢查這個條件'if((Get-Service $ sn)-eq $ null)' –

回答

0

Get-Service接受服務的列表,所以你可以簡單地做下面沒有環。不過,我建議將服務作爲參數傳遞,但是,如果您將檢查封裝在函數中。

function servicevalidation($svc) { 
    if (Get-Service $svc -ErrorAction SilentlyContinue) { 
    Write-Host 'Young jedi you are mistaken, this server is not a collector!' 
    } else { 
    Write-Host "$svc present." 
    } 
} 

servicevalidation $servicenames 

-ErrorAction SilentlyContinue抑制錯誤輸出的情況下的服務不存在。

如果你想知道哪些服務正是缺少你可以用Where-Object過濾器這樣做:

function servicevalidation($svc) { 
    $missing = $svc | Where-Object { 
    -not (Get-Service $_ -ErrorAction SilentlyContinue) 
    } 

    if ($missing) { 
    Write-Host "missing service: $missing" 
    } else { 
    Write-Host "$svc present." 
    } 
}