gpt4 book ai didi

powershell - RunSpace及其关闭

转载 作者:行者123 更新时间:2023-12-03 01:29:13 25 4
gpt4 key购买 nike

在使用使用RunSpace的脚本时,我发现它占用越来越多的系统内存。据我了解,这是由于打开RunSpace完成后不会关闭的事实。它们保留在内存中,累积兆字节。

如何正确关闭RunSpace?但是,我不知道需要多长时间-1秒或1个小时。完成后自行关闭。

例如,我将给出任意脚本。

第一个脚本是我完成RunSpace时的关闭方式(它显然不起作用)。

$Array = 1..10000

$PowerShell = [PowerShell]::Create()
$RunSpace = [Runspacefactory]::CreateRunspace()
$RunSpace.Open()

$RunSpace.SessionStateProxy.SetVariable('Array', $Array)
$RunSpace.SessionStateProxy.SetVariable('PowerShell', $PowerShell)

$PowerShell.Runspace = $RunSpace

[void]$PowerShell.AddScript({

# Fill the system memory so that it can be seen in the Task Manager.
$Array += $Array
$Array

# Closing the Process, which should close the RunSpace, but this does not happen.
$Powershell.Runspace.Dispose()
$PowerShell.Dispose()
})

$Async = $PowerShell.BeginInvoke()

# Other jobs in the main thread...


从系统内存来看,第二个脚本似乎更正确。但是,由于 Start-Sleep 10冻结了主进程,因此它在生活中当然不适用。
$Array = 1..10000

$PowerShell = [PowerShell]::Create()
$RunSpace = [Runspacefactory]::CreateRunspace()
$RunSpace.Open()

$RunSpace.SessionStateProxy.SetVariable('Array', $Array)

$PowerShell.Runspace = $RunSpace

[void]$PowerShell.AddScript({

# Fill the system memory so that it can be seen in the Task Manager.
$Array += $Array
$Array
})

$Async = $PowerShell.BeginInvoke()

Start-Sleep 10

$PowerShell.EndInvoke($Async) | Out-Null
$PowerShell.RunSpace.Dispose()
$PowerShell.Dispose()

# Other jobs in the main thread...

请给我写正确的方法,以在完成运行后关闭RunSpace。谢谢

最佳答案

尝试从该运行空间中处置一个运行空间听起来是个坏主意-实际上,如果我在PowerShell Core 7.0-rc2中尝试此操作,则 session 将挂起。

听起来像,您想在脚本完成后自动处置运行空间。

您可以为 System.Management.Automation.PowerShell.InvocationStateChanged 事件设置事件处理程序,在其中可以检查CompletedFailed状态并关闭运行空间,然后:

注意: Register-ObjectEvent 必须用于订阅事件;原则上可以通过将脚本块直接传递到.add_InvocationStateChanged()实例上的PowerShell进行订阅,但是当您稍后调用.EndInvoke()时,执行将挂起。

# Note: I'm using a small array so that the output of the code better
# shows what's happening.
$Array = 1..3

$PowerShell = [PowerShell]::Create()
$RunSpace = [Runspacefactory]::CreateRunspace()
$RunSpace.Open()

$RunSpace.SessionStateProxy.SetVariable('Array', $Array)

$PowerShell.Runspace = $RunSpace

$null = $PowerShell.AddScript( {

# Fill the system memory so that it can be seen in the Task Manager.
$Array += $Array
$Array

})

# Set up an event handler for when the invocation state of the runspace changes.
# Note: Register-ObjectEvent with -Action returns an event-job object, which
# we don't need in this case.
$null = Register-ObjectEvent -InputObject $PowerShell -EventName InvocationStateChanged -Action {
param([System.Management.Automation.PowerShell] $ps)

# NOTE: Use $EventArgs.InvocationStateInfo, not $ps.InvocationStateInfo,
# as the latter is updated in real-time, so for a short-running script
# the state may already have changed since the event fired.
$state = $EventArgs.InvocationStateInfo.State

Write-Host "Invocation state: $state"
if ($state -in 'Completed', 'Failed') {
# Dispose of the runspace.
Write-Host "Disposing of runspace."
$ps.Runspace.Dispose()
# Speed up resource release by calling the garbage collector explicitly.
# Note that this will pause *all* threads briefly.
[GC]::Collect()
}

}

# Kick off execution of the script and
# let the event handler dispose of the runspace on completion.
Write-Host 'Starting script execution via SDK...'
$asyncResult = $PowerShell.BeginInvoke()

# Perform other processing.
Write-Host 'Doing things...'
1..1e5 | ForEach-Object { }

# Finally, get the results from the script execution.
# NOTE: Even though the runspace has likely already been disposed, collecting
# the results seemingly still works.
Write-Host 'Collecting script-execution results...'
$PowerShell.EndInvoke($asyncResult)

# Note that you'll have to create and assign a *new* runspace to
# $PowerShell.Runspace if you want to execute further code.

Write-Host 'Done.'

上面应该产生以下输出:

Starting script execution via SDK...
Doing things...
Invocation state: Running
Invocation state: Completed
Disposing of runspace.
Collecting script-execution results...
1
2
3
1
2
3
Done.

关于powershell - RunSpace及其关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com