2017-12-05 18 views
2

サービスを開始しないようにコードを改善したいと考えています。この単純なコードを考えてみましょう:サービスが開始されるのを待ちますwhileループ

while ((Get-Service $service).Status -eq 'Stopped') 
{ 
    Start-Service $service -ErrorAction SilentlyContinue -Verbose:$false 
} 

をサービスを開始する問題がある場合、私はそれが通常起動し、WARNING: Waiting for service '...' to Start... 2-3回を参照してください。私の問題は、サービスがエラーのためを開始しない場合です。whileは無限ループに詰め込まれています。

これを処理し、無限ループを回避するより良い方法はありますか?

答えて

2

サービスを開始し、指定された時間の開始を待つ方法の1つです。サービスが正常に開始された場合は0を返し、サービスが存在しない場合、サービスが既に実行中の場合、またはサービスが開始するのを待ってコードがタイムアウトした場合にエラーコードを返します。

$ERROR_SERVICE_REQUEST_TIMEOUT = 1053 
$ERROR_SERVICE_ALREADY_RUNNING = 1056 
$ERROR_SERVICE_DOES_NOT_EXIST = 1060 

function Start-Service { 
    param(
    [String] $serviceName, 
    [Int32] $timeoutSeconds 
) 
    $service = Get-Service $serviceName 
    if (-not $service) { 
    return $ERROR_SERVICE_DOES_NOT_EXIST 
    } 
    if ($service.Status -eq [ServiceProcess.ServiceControllerStatus]::Running) { 
    return $ERROR_SERVICE_ALREADY_RUNNING 
    } 
    $timeSpan = New-Object Timespan 0,0,$timeoutSeconds 
    try { 
    $service.Start() 
    $service.WaitForStatus([ServiceProcess.ServiceControllerStatus]::Running, $timeSpan) 
    return 0 
    } 
    catch [Management.Automation.MethodInvocationException],[ServiceProcess.TimeoutException] { 
    return $ERROR_SERVICE_REQUEST_TIMEOUT 
    } 
} 
関連する問題