Выход из команды PS через определенное время? - PullRequest
0 голосов
/ 01 декабря 2019

Я ищу пример, который может выйти из текущей команды, если она будет выполняться дольше, чем, скажем, 1 минута, что позволило бы мне выполнить ее повторно.

Вот мой сценарий:

$ServiceName = 'service'
$arrService = Get-Service -Name $ServiceName

while ($arrService.Status -ne 'Running')
{

    Start-Service $ServiceName
    write-host $arrService.status
    write-host 'Service starting'
    Start-Sleep -seconds 3
    $arrService.Refresh()
    if ($arrService.Status -eq 'Running')
    {
        Write-Host 'Service is now Running'
    }

}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2019

Можно использовать некоторую полировку, но может сработать что-то похожее на приведенное ниже:

$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 секунд.

Если вы хотите, чтобы проверка происходила хотя бы один раз, я бы переключил это на «До». В то время, как, если служба запускается достаточно быстро, вы не увидите сообщение «Служба запущена»

Дайте мне знать, как она работает.

0 голосов
/ 01 декабря 2019

Используйте Start-Job Командлет Start-Job для запуска процесса. Затем определите Wait-Job Wait-Job командлет с -timeout . -Timeout определяет время окончания ожидания, и командная строка вернется.

Следует помнить: -timeout не отображать никаких сообщений об ошибках. Помните об этом при обработке ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...