PowerShell的启动服务超时(PowerShell Start-Service Timeout

2019-09-30 17:12发布

问题

我一直在为一个超时功能Start-Services我的应用程序的功能,并在一些挫折,其中超时工作不正常或无法正确显示都有所涉猎。

我的两个常量被设置为这样的:

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

我的代码的其余部分已经改变多时间,试图实现我的目标。 我已经尝试了所有与很少或根本没有成功以下。 每次尝试都会有一个简短的介绍:

在这种情况下,我试图创建一个新的工作,把动作做内部While循环,并退出表示,如果经过时间=超时时间或工作状态是“正在运行”循环。 不幸的是,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)

这也打破了在启动服务cmdlet以进行类似的原因为上述实例

Do {
    $counter++
    Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
} While ($elapsedTime -eq $timeout)

我也试过用Write-Progress ,而不是作为一种更dymanic变种...但没有在初始化方面做很多工作Start-Services的说法。

我曾尝试过几个职位寻找替代的方式来做到这一点的希望读书为好,但即使这些变化失败...并不亚于我喜欢的方式Write-Progress工作......我不明白如何清除它从屏幕(没有清除整个命令屏幕)或如何控制它出现cmd窗口上。 不管怎么说,你可以找到低于替代资源的开发:

PowerShell的超时服务

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

PowerShell的启动过程中,有超时等待,杀死并获取退出代码

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

有谁知道如何解决我的代码,这将有助于我不仅超时的问题Start-Process ,但要正确显示所经过的时间?

提前致谢

Answer 1:

您创建了一个名为秒表$elapsedTime

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

这是一种令人困惑,因为你选择了这个名字似乎没有什么。 因此,当您要比较对你超时,$ elapsedTime并不表示为一个时间跨度,你可能要迅速地想读变量名经过的时间,这是你的秒表对象。

因此,您的

 While ($elapsedTime -le $timeout)

其实应该是

While ($elapsedTime.Elapsed -le $timeout)


文章来源: PowerShell Start-Service Timeout