Как ограничить цикл по времени в powershell - PullRequest
0 голосов
/ 02 мая 2019

У меня есть скрипт, который запускает процесс только после запуска определенной службы.Это цикл, который пытается Get-Service его статус.Я не могу найти способ ограничения цикла по времени.

Часть, в которой я застрял:

#add Start button
$button_start = New-Object System.Windows.Forms.Button
$button_start.Location = New-Object System.Drawing.Size(25,70)
$button_start.Size = New-Object System.Drawing.Size(240,32)
$button_start.TextAlign = "MiddleCenter"
$button_start.font = New-Object System.Drawing.Font("Segoe UI",14,[System.Drawing.FontStyle]::Regular)
$button_start.BackColor = "seashell"
$button_start.Text = "Start"
$button_start.Add_Click({
    #add statement
    while ((Get-Service -ComputerName $textBox_IP.text -ServiceName wscsvc).Status -ne "Running") {
        # Pause before next check
        Start-Sleep -Seconds 1
    }

    #only then..
    Start-Process -FilePath "C:\Users\username\Desktop\software.exe" -verb RunAs -ArgumentList $textBox_IP.text
})

$Form_remoteControl.Controls.Add($button_start)

Я безуспешно пытался найти информацию в Интернете по сети.

Ответы [ 3 ]

0 голосов
/ 02 мая 2019

Это пример того, как остановить службу и подождать, пока она не остановится или не истечет время ожидания. Вы можете изменить, чтобы запустить службу.

Function StopService ($serv)
{
    Write-Host "Config service " $serv  " ..."         
    $service = Get-Service $serv -ErrorAction SilentlyContinue
    if ($service)
    {
        if($service.status -eq "running")
        {
            write-host "Stop service" $serv
            Stop-Service $serv  -Force

            # Wait until service is stopped (max. 1 minute)
            $acttime  = 0
            $waittime = 100
            $maxtime  = 60000

            $TestService = Get-Service $serv
            While($TestService | Where-Object {$_.Status -eq 'Running'})
            {                     
                Start-Sleep -m $waittime
                $acttime += $waittime
                if ($acttime -gt $maxtime)
                {
                    write-host "ERROR: Service" $serv " could not be stopped!" -ForegroundColor Red                       
                    return $False
                } 
            }   
        } 
        else
        {
            write-host "Service already stopped!" -ForegroundColor Green   
            return $True             
        }

    }
    else 
    {
        write-host "Service not installed" -ForegroundColor Green
        return $True
    }
}
0 голосов
/ 02 мая 2019

Я рекомендую вам , а не , используя любые циклы опроса WhileStart-Sleep командлетами) в интерфейсе форм Windows. Он остановит ваш интерфейс для важных событий формы, таких как нажатия кнопок и т. Д.
Вместо этого я бы ожидал, что класс Windows.Forms Timer создаст событие таймера и выполнит соответствующие проверки и действия через определенный промежуток времени (например, новый Start-Process в зависимости от состояния службы).

0 голосов
/ 02 мая 2019

Определите лимит времени и проверьте, превышает ли текущее время этот лимит.

$limit = (Get-Date).AddMinutes(5)
while (... -or (Get-Date) -gt $limit) {
    Start-Sleep -Seconds 1
}

Если вы хотите пропустить запуск внешней программы, когда служба еще не запущена, добавьте еще одну проверку после цикла, по которому вы возвращаетесь:

if ((Get-Service ...).Status -ne "Running") {
    return
}
...