【发布时间】:2019-01-19 23:07:43
【问题描述】:
我有一个复杂的 PowerShell 函数,我想运行另一个线程。
但是,如果我是对的,则无法在脚本块中访问该函数。我想避免复制它旁边的每个相关函数。
有什么方法或者方法可以调用scriptblock中的函数吗?
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
}
}
【问题讨论】:
-
您可以将
complex_function本身传递给您的脚本块。你可以试试看:stackoverflow.com/questions/22129621/… -
如何使用 AddArgument 函数传递它?它也有一些论据。
-
我认为你可以使用类似
Invoke-Command -ScriptBlock ${Function:Complex_Function} -ArgumentList 'arg1','arg2'的东西。我发现了一个关于这个的博客here
标签: multithreading powershell runspace scriptblock