我一直在为我的应用程序的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 Start Process, Wait with Timeout, Kill and Get Exit Code
有没有人知道如何解决我的代码问题,这不仅可以帮助我超时Start-Process
,还可以正确显示已用时间?
提前致谢
答案 0 :(得分:2)
您创建了一个名为$elapsedTime
$elapsedTime = [System.Diagnostics.Stopwatch]::StartNew()
这有点令人困惑,因为你选择的名字并不像它看起来那样。 因此,当您想要与超时进行比较时,$ elapsedTime不是表示为时间跨度的经过时间,因为您可能会认为快速读取变量名称,它是您的Stopwatch对象。
因此,你的
While ($elapsedTime -le $timeout)
实际上应该是
While ($elapsedTime.Elapsed -le $timeout)