Как вызвать вне определенной функции в скриптовом блоке runspace
У меня есть сложная функция PowerShell, которую я хотел бы запускать другие потоки.
Однако, если я прав, функция не может быть доступна в блоке скриптов. Я хочу избежать копирования всех связанных функций рядом с ним.
Есть ли способ или метод для вызова функции в блоке сценария?
function Function1 {
Param()
Process {
$param1 = "something"
$pool = [RunspaceFactory]::CreateRunspacePool(1, [int]$env:NUMBER_OF_PROCESSORS + 1)
$pool.ApartmentState = "MTA"
$pool.Open()
$runspaces = @()
$scriptblock = {
Param (
[Object] [Parameter(Mandatory = $true)] $param1
)
Complex_Function -param1 $param1
}
1..10 | ForEach-Object {
$runspace = [PowerShell]::Create()
$null = $runspace.AddScript($scriptblock)
$null = $runspace.AddArgument($param1)
$runspace.RunspacePool = $pool
$runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() }
}
while ($runspaces.Status -ne $null) {
$completed = $runspaces | Where-Object { $_.Status.IsCompleted -eq $true }
foreach ($runspace in $completed) {
$runspace.Pipe.EndInvoke($runspace.Status)
$runspace.Status = $null
}
}
$pool.Close()
$pool.Dispose()
}
}
function Complex_Function {
Param(
[Object] [Parameter(Mandatory = $true)] $param1
)
Process {
#several function calls
}
}
1 ответ
Я думаю, что код, найденный в этом посте, вероятно, то, что вы ищете:
Function ConvertTo-Hex {
Param([int]$Number)
'0x{0:x}' -f $Number
}
#Get body of function
$Definition = Get-Content Function:\ConvertTo-Hex -ErrorAction Stop
#Create a sessionstate function entry
$SessionStateFunction = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry
-ArgumentList 'ConvertTo-Hex', $Definition
#Create a SessionStateFunction
$InitialSessionState.Commands.Add($SessionStateFunction)
#Create the runspacepool by adding the sessionstate with the custom function
$RunspacePool = [runspacefactory]::CreateRunspacePool(1,5,$InitialSessionState,$Host)
Сделайте что-то похожее с вашей Complex_Function и (я полагаю) с любой другой функцией, которая вам нужна, и они должны использоваться в ваших пространствах выполнения.
Вы спросили в комментариях, как собрать все функции. Путь function:/
можно просматривать и искать как каталог, так get-chiditem function:/
получает все определенные на данный момент функции.
При экспериментировании с этим кажется, что функции, определенные в текущем сценарии или в сценариях с точечными источниками, имеют пустой Source
имущество. Поиграйте с этим. Это должно привести к тому, что вы хотите.
$InitialSessionState = [initialsessionstate]::Create()
Get-ChildItem function:/ | Where-Object Source -like "" | ForEach-Object {
$functionDefinition = Get-Content "Function:\$($_.Name)"
$sessionStateFunction = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry `
-ArgumentList $_.Name, $functionDefinition
$InitialSessionState.Commands.Add($sessionStateFunction)
}