Powershell Подождите, пока сервис будет остановлен или запущен

Я искал как этот форум, так и через google и не могу найти то, что мне нужно. У меня довольно большой script, и я ищу код, который проверяет, запущена или остановлена ​​служба, прежде чем перейти к следующему шагу.

Функция, которой он сам должен зацикливаться, пока он не остановится или не запустится (для функции "Остановлен" и "Один для запуска" ).

Всего 4 службы, которые имеют почти одинаковое имя, поэтому Service Bus * можно использовать в качестве подстановочного знака.

Ответ 1

Следующее закроет и проверяет статус данных сервисов, пока количество служб с состоянием "Запуск" не будет равно нулю (следовательно, они будут остановлены), поэтому вы можете использовать это, если вы ожидаете, что службы остановятся.

Я добавил переменную $MaxRepeat, которая предотвратит ее запуск навсегда. Он будет работать в 20 раз больше, чем определено.

$services = "Service Bus *"
$maxRepeat = 20
$status = "Running" # change to Stopped if you want to wait for services to start

do 
{
    $count = (Get-Service $services | ? {$_.status -eq $status}).count
    $maxRepeat--
    sleep -Milliseconds 600
} until ($count -eq 0 -or $maxRepeat -eq 0)

Ответ 2

Я не мог получить стратегию "count", которую написал Микки, чтобы работать, вот как я ее решил:

Я создал функцию, которая принимает searchString (это может быть "Service Bus *" ), и статус, который я ожидаю, должен достичь.

function WaitUntilServices($searchString, $status)
{
    # Get all services where DisplayName matches $searchString and loop through each of them.
    foreach($service in (Get-Service -DisplayName $searchString))
    {
        # Wait for the service to reach the $status or a maximum of 30 seconds
        $service.WaitForStatus($status, '00:00:30')
    }
}

Теперь функцию можно вызвать с помощью

WaitUntilServices "Service Bus *" "Stopped"

или

WaitUntilServices "Service Bus *" "Running"

Если достигнут период ожидания, генерируется не очень изящное исключение:

Exception calling "WaitForStatus" with "2" argument(s): "Time out has expired and the operation has not been completed."

Ответ 3

В дополнение к ответу mgarde этот вкладыш может быть полезен, если вы просто хотите подождать один сервис (также вдохновленный постом Шей Леви):

(Get-Service SomeInterestingService).WaitForStatus('Running')

Ответ 4

Мне пришлось немного подправить это с несколькими счетчиками, потому что эта служба нарочно запускается и останавливается медленно. Оригинальный сценарий поставил меня на правильный путь. Мне пришлось ждать, пока служба полностью остановится, прежде чем я смог продолжить работу, потому что я фактически перезапускаю ту же службу. Технически вы, вероятно, могли бы удалить "сон", но я не против оставить его в покое.

    # change to Stopped if you want to wait for services to start
    $running = "Running" 
    $stopPending = "StopPending"
    $stopped = "Stopped"
    do 
    {
        $count1 = (Get-Service $service | ? {$_.status -eq $running}).count
        sleep -Milliseconds 600
        $count2 = (Get-Service $service | ? {$_.status -eq $stopPending}).count
        sleep -Milliseconds 600
        $count3 = (Get-Service $service | ? {$_.status -eq $stopped}).count
        sleep -Milliseconds 600
    } until ($count1 -eq 0 -and $count2 -eq 0 -and $count3 -eq 1)