如何设置PowerShell脚本运行的时间限制?

Dav*_*mas 5 powershell time multithreading limit powershell-2.0

我想在PowerShell(v2)脚本上设置一个时间限制,以便在该时间限制到期后强行退出.

我在PHP中看到他们有像set_time_limit和max_execution_time这样的命令,你可以限制脚本甚至函数执行的时间.

使用我的脚本,查看时间的do/while循环是不合适的,因为我正在调用一个可以挂起很长时间的外部代码库.

我想限制一段代码并且只允许它运行x秒,之后我将终止该代码块并向用户返回脚本超时的响应.

我查看了后台作业,但它们在不同的线程中运行,因此不会对父线程具有终止权限.

有没有人处理过此问题或有解决方案?

谢谢!

One*_*yth 1

我知道这是一篇旧文章,但我在我的脚本中使用了它。

我不确定它的使用是否正确,但是 George 提出的 System.Timers.Timer 给了我一个想法,它似乎对我有用。

我将它用于有时挂起 WMI 查询的服务器,超时会阻止它卡住。然后,我将消息输出到日志文件,而不是写入主机,这样我就可以看到哪些服务器已损坏,并在需要时修复它们。

我也不使用 GUID,而是使用服务器主机名。

我希望这是有道理的并对你有帮助。

$MyScript = {
              Get-WmiObject -ComputerName MyComputer -Class win32_operatingsystem
            }

$JobGUID = [system.Guid]::NewGuid()

$elapsedEventHandler = {
    param ([System.Object]$sender, [System.Timers.ElapsedEventArgs]$e)

    ($sender -as [System.Timers.Timer]).Stop()
    Unregister-Event -SourceIdentifier $JobGUID
    Write-Host "Job $JobGUID removed by force as it exceeded timeout!"
    Get-Job -Name $JobGUID | Remove-Job -Force
}

$timer = New-Object System.Timers.Timer -ArgumentList 3000 #just change the timeout here
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action $elapsedEventHandler -SourceIdentifier $JobGUID
$timer.Start()

Start-Job -ScriptBlock $MyScript -Name $JobGUID
Run Code Online (Sandbox Code Playgroud)