复用 Start-ThreadJob 中的 2 个函数

Reuse 2 functions in Start-ThreadJob

假设 Get-FooGet-Foo2 以及 Deploy-Jobs 是 3 个函数,它们是一个非常大的模块的一部分。我想在 Deploy-JobsStart-ThreadJob(下方) 中使用 Get-FooGet-Foo2,而无需 每次都重新加载整个模块。

是否有可用的工作示例来说明如何执行此操作?

function Deploy-Jobs {

    foreach ($Device in $Devices) {

        Start-ThreadJob -Name $Device -ThrottleLimit 50 -InitializationScript $initScript -ScriptBlock {
            param($Device)

            Get-Foo | Get-Foo2 -List
        
        } -ArgumentList $Device | out-null
    }
}

可用于将函数定义传递到不同范围的方法与 Invoke-Command(当 PSRemoting 时)、Start-JobStart-ThreadJobForeEach-Object -Parallel 相同.由于您想在作业的 脚本块 中调用 2 个不同的函数,我认为 -InitializationScript 不是一个选项,即使是,它也可能使代码变得更均匀比它应该的更复杂。

您可以以此为例,说明如何将 2 个函数定义存储在一个数组 ($def) 中,然后将其传递到每个 TreadJob 的范围,然后使用此数组定义每个所述作用域中的函数稍后将被每个作业使用。

function Say-Hello {
    "Hello world!"
}

function From-ThreadJob {
    param($i)
    "From ThreadJob # $i"
}

$def = @(
    ${function:Say-Hello}.ToString()
    ${function:From-ThreadJob}.ToString()
)

function Run-Jobs {
    param($numerOfJobs, $functionDefinitions)

    $jobs = foreach($i in 1..$numerOfJobs) {
        Start-ThreadJob -ScriptBlock {
            # bring the functions definition to this scope
            $helloFunc, $threadJobFunc = $using:functionDefinitions
            # define them in this scope
            ${function:Say-Hello} = $helloFunc
            ${function:From-ThreadJob} = $threadJobFunc
            # sleep random seconds
            Start-Sleep (Get-Random -Maximum 10)
            # combine the output from both functions
            (Say-Hello) + (From-ThreadJob -i $using:i)
        }
    }

    Receive-Job $jobs -AutoRemoveJob -Wait
}

Run-Jobs -numerOfJobs 10 -functionDefinitions $def