PowerShell启动服务超时



问题

我一直在为我的应用程序的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)

相关内容

  • 没有找到相关文章