结束定时循环

时间:2014-07-17 11:24:00

标签: powershell

首先,我想说我只使用了powershell几周,所以请原谅我,如果问题是相当基本的话。我环顾四周,似乎找不到任何与我正在尝试的东西相符的东西(或者我不能正确理解它 - 可能就是这种情况)。

基本上我有一个在循环中启动服务的函数,在继续之前检查以确保进程处于停止状态。这是因为服务可能需要相当长的时间才能停止。到目前为止,我有以下内容:

Function Start_service {
$timeout = new-timespan -seconds 60
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout){
    if ((Get-Service $Service).Status -eq "Stopped"){
        start-service $service
        write-host Starting $service service
    }
start-sleep -seconds 1
}
}

我正在尝试添加到该函数中的是检查服务是否处于运行状态,如果是,则退出循环并继续。但我似乎无法确定这一部分。

任何人都可以帮忙解释一下我是怎么做到的吗?或者,如果有更好的方法来做我想做的事情?

3 个答案:

答案 0 :(得分:0)

您可以像许多其他语言一样使用break

$sec = 0;
while ($true){
    $sec++;
    Write-Host $sec;
    start-sleep -seconds 1
    if ($sec -gt 3) {
        break;
    }
}

答案 1 :(得分:0)

您可以展开while条件:

while (!(Get-Service $Service | ? { $_.Status -eq 'Running' }) -and $sw.Elapsed -lt $timeout)

我也可能不会在这里使用Stopwatch,而只是存储开始时间并与当前时间进行比较以检查超时。

答案 2 :(得分:0)

以下单行使用超时控制进行服务停止操作,但是一旦服务达到停止状态就会退出:

Get-Service -Name "myservice" | % { $_.Stop(); $_.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped, "00:01:00") }

Get-Service将检索服务,将其传递给管道。在随后的块中,我们使用$_.Stop()启动停止服务而不等待它完成,并立即开始等待服务对象达到Stopped状态。 WaitForStatus()的秒参数控制超时(在此特定情况下为1分钟)。