Можно использовать некоторую полировку, но может сработать что-то похожее на приведенное ниже:
$ServiceName = 'W32Time'
$arrService = Get-Service -Name $ServiceName
$Interval = 3
$TimeOut = 20
$Count = 0
Start-Service $ServiceName
:SrvCheck While ( $arrService.Status -ne 'Running' )
{
$arrService.Refresh()
if ( $arrService.Status -eq 'Running' )
{
Write-Host 'Service is now Running'
Break SrvCheck
}
if ( $Count -ge $timeout )
{
Write-Host "Timed out wating for service : $ServiceName to start, waited $($Count*$Interval) Seconds..."
Break SrvCheck
}
Write-Host "Waiting for service start, Current Status $($arrService.Status) ... Checks: $Count | Time Elapsed: $($Count*$Interval) ."
Start-Sleep -Seconds $Interval
++$Count
}
Убрал запуск службы из цикла, если только вы не намеревались повторять попытку запуска после каждой неудачной проверки. Тем не менее, вы можете захотеть положить некоторые ошибки обработки вокруг него. Я знаю, например, что UAC может вмешиваться в запрос на запуск службы, поэтому вы можете что-то там захотеть.
Таким образом, переменная $ TimeOut равна 20, поэтому каждый интервал, равный 3 секундам, будет прерываться на 60 секунд.
Если вы хотите, чтобы проверка происходила хотя бы один раз, я бы переключил это на «До». В то время, как, если служба запускается достаточно быстро, вы не увидите сообщение «Служба запущена»
Дайте мне знать, как она работает.