PowerShell启动服务超时

时间:2017-10-02 19:52:58

标签: powershell timeout stopwatch start-process

问题

我一直在为我的应用程序的Start-Services功能设置一个超时功能,并偶然发现了一些挫折,其中超时没有正常工作或无法正常显示。

我的两个常量设置如下:

$timeout = New-TimeSpan -Seconds $SecondsToWait
$elapsedTime = [System.Diagnostics.Stopwatch]::StartNew()

我的其余代码已经多次更改以尝试实现我的目标。我尝试了以下所有内容,但很少或没有成功。每次尝试都会有一个简短的描述:

在这种情况下,我尝试创建一个新作业,将操作放在Do While循环内,如果Elapsed Time = Timeout time或者Job State是' Running'则退出循环。不幸的是,这在while循环期间中断了。

$j = Start-Job -ScriptBlock { Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue }

Do {
    If ($j.State -eq "Running") { break }
    $j | Receive-Job
} While ($elapsedTime -le $timeout)

我尝试使用不同格式的Do While循环,但仍然遇到问题,因为当它遇到Start-Service行时遇到无限循环,它无法自动启动。

Do {
    $counter++
    Start-Sleep 1
    Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue

    # this line is just a custom function that gets the status of the service and checks a number of times based on the 'SecondsToWait' Parameter. 
    Wait-ServiceState -ServiceName $ServiceName -ServiceState "Running" -SecondsToWait 1
} While ($elapsedTime -le $timeout)

由于与上述实例

类似的原因,它在Start-Service Cmdlet中也会中断
Do {
    $counter++
    Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
} While ($elapsedTime -eq $timeout)

我也尝试使用Write-Progress作为更加笨拙的变体...但是在初始化Start-Services参数方面没有做太多。

我也试过阅读几篇文章,希望找到其他方法来做到这一点,但即使是那些变化也失败了...尽管我喜欢Write-Progress的工作方式......我无法&# 39;了解如何从屏幕上清除它(不清除整个cmd屏幕)或如何控制它在cmd窗口中的显示位置。无论如何,你可以在下面找到那些替代资源:

Powershell timeout service

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/start-job?view=powershell-5.1

Powershell Start Process, Wait with Timeout, Kill and Get Exit Code

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-progress?view=powershell-5.1

问题

有没有人知道如何解决我的代码问题,这不仅可以帮助我超时Start-Process,还可以正确显示已用时间?

提前致谢

1 个答案:

答案 0 :(得分:2)

您创建了一个名为$elapsedTime

的秒表
$elapsedTime = [System.Diagnostics.Stopwatch]::StartNew()

这有点令人困惑,因为你选择的名字并不像它看起来那样。 因此,当您想要与超时进行比较时,$ elapsedTime不是表示为时间跨度的经过时间,因为您可能会认为快速读取变量名称,它是您的Stopwatch对象。

因此,你的

 While ($elapsedTime -le $timeout)

实际上应该是

While ($elapsedTime.Elapsed -le $timeout)