首先,我想说我只使用了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
}
}
我正在尝试添加到该函数中的是检查服务是否处于运行状态,如果是,则退出循环并继续。但我似乎无法确定这一部分。
任何人都可以帮忙解释一下我是怎么做到的吗?或者,如果有更好的方法来做我想做的事情?
答案 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分钟)。