Если вы хотите иметь общее состояние между вашим основным контекстом выполнения и отдельным пространством выполнения или пулом пространства выполнения, используйте переменную SessionStateProxy
и назначьте синхронизированную коллекцию или словарь:
$sharedData = [hashtable]::Synchronized(@{})
$rs = [runspacefactory]::CreateRunspace()
$rs.Open()
$rs.SessionStateProxy.SetVariable('sharedData',$sharedData)
Теперь переменная $sharedData
относится к одной и той же синхронизированной хэш-таблице как в вызывающем пространстве выполнения, так и внутри $rs
Ниже приведено основное описание использования областей выполнения
Вы можете прикрепитьпространство выполнения для свойства Runspace
объекта PowerShell
, и оно будет выполняться в этом пространстве:
$rs = [runspacefactory]::CreateNewRunspace()
$rs.Open()
$ps = { Get-Random }.GetPowerShell()
$ps.Runspace = $rs
$result = $ps.Invoke()
Вы также можете назначить RunspacePool
нескольким PowerShell
экземплярам и выполнять их выполнениеодновременно:
# Create a runspace pool
$rsPool = [runspacefactory]::CreateRunspacePool()
$rsPool.Open()
# Create and invoke bunch of "jobs"
$psInstances = 1..10 |ForEach-Object {
$ps = {Get-Random}.GetPowerShell()
$ps.RunspacePool = $rsPool
[pscustomobject]@{
ResultHandle = $ps.BeginInvoke()
Instance = $ps
}
}
# Do other stuff here
# Wait for the "jobs" to finish
do{
Start-Sleep -MilliSeconds 100
} while(@($psInstances.ResultHandle.IsCompleted -eq $false).Count -gt 0)
# Time to collect our results
$results = $psInstances |ForEach-Object {
if($_.Instance.HadErrors){
# Inspect $_.Instance.Streams.Error in here
}
else {
# Retrieve results
$_.Instance.EndInvoke($_.ResultHandle)
}
}