2017-07-16 1 views
-1

以下のコードは、2つのハードコードされたサービス名(これは決して変更されません)をチェックするように設計されており、見つからなければサービスは存在しません。これは行いますが、チェックするサービスが2つあるので2行を出力します。ループは出力を複製しています

これを変更して、両方のサービスを確認した後に出力が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を参照してください。 microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.management/get-service#default-default)。そして、私はあなたがこの条件 'if((Get-Service $ sn)-eq $ null)'をチェックしたいと確信しています。 –

答えて

0

はサービスのリストを受け入れるので、ループなしで簡単に実行できます。とにかく関数のチェックをカプセル化している場合は、引数としてサービスを渡すことをお勧めします。

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フィルターでそうする可能性が不足しているサービスを知りたい場合は

:// MSDN:あなたはオプションが含まれて一緒にサービス名を使用することはできません

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

    if ($missing) { 
    Write-Host "missing service: $missing" 
    } else { 
    Write-Host "$svc present." 
    } 
} 
関連する問題