2017-07-16 60 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." 
    } 
}