问题
我一直在为我的应用程序的Start-Services
功能创作超时功能,并偶然发现了一些挫折,其中超时无法正常工作或无法正常显示。
我的两个常数设置为:
$timeout = New-TimeSpan -Seconds $SecondsToWait
$elapsedTime = [System.Diagnostics.Stopwatch]::StartNew()
我的其余代码已更改了多个时间,以尝试实现我的目标。我尝试了以下所有内容,几乎没有成功。每次尝试都有一个简短的描述:
在这种情况下,我试图创建一项新工作,将操作放入DO中,而循环和退出表示循环,如果超过时间=超时时间或工作状态为"运行"。不幸的是,这在段循环中破裂。
$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,但是仍然存在问题,因为它在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)
,这也出于与上述实例相似的原因在开始服务的CMDLET上
Do {
$counter++
Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
} While ($elapsedTime -eq $timeout)
我还尝试使用 Write-Progress
而不是用作更富有的变种...但是在初始化 Start-Services
参数方面,这并没有多大作用。
我也尝试阅读几篇文章,希望能找到其他方法来做到这一点,但是即使这些变化都失败了……而且我喜欢Write-Progress
的工作方式……我无法理解如何从屏幕上清除它(不清除整个CMD屏幕)或如何控制CMD窗口上的位置。无论如何,您可以在下面找到这些替代资源:
PowerShell超时服务
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/start-job?view=powershell-5.1
powershell启动过程,等待超时,杀死和获取退出代码
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-progress?view=powershell-5.1
问题
有人知道如何通过我的代码解决问题,这不仅可以帮助我超时Start-Process
,还可以正确显示经过的时间?
预先感谢
您创建了一个名为$elapsedTime
$elapsedTime = [System.Diagnostics.Stopwatch]::StartNew()
这有点令人困惑,因为您选择的名字不是看起来。因此,当您想与超时进行比较时,$ ElapsedTime并不是代表的经过的时间,因为您可能会想快速阅读变量名称,而是您的秒表对象。
因此,您的
While ($elapsedTime -le $timeout)
实际上应该是
While ($elapsedTime.Elapsed -le $timeout)