解决 powershell 作业范围问题的优雅方法

Elegant way to get around scoping issues with powershell jobs

我在单独的文件中有函数,我需要 运行 作为一个主文件中的作业。

我需要能够传递这些函数参数。

这是我的:

testJobsMain.ps1:

$Functions = {
    . c:\.ps\func1.ps1
    . c:\.ps\func2.ps1
}

$arrOutput = @()
foreach($i in ('aaa','bbb','ccc','ddd','eee') ) {

    $ExecutionBlock = {
        FOO -myArg $i
        FOO2 -blah 'zzzzzzz'
    }

    $arrOutput += Start-Job -InitializationScript $Functions `
        -ScriptBlock $ExecutionBlock | 
            Wait-Job | Receive-Job
}

$arrOutput

func1.ps1

function FOO( $myArg ) { write-output $myArg }

func2.ps1

function FOO2( $blah ) { write-output $blah }

这是 testJobsMain 的输出。ps1:

PS> .\testjobsMain.ps1
zzzzzzz
zzzzzzz
zzzzzzz
zzzzzzz

$i 没有传递给函数。我该怎么做?

您必须像这样将其作为参数传递

$ExecutionBlock = {
    param($passedI)
    FOO -myArg $passedI
    FOO2 -blah 'zzzzzzz'
}
$arrOutput += Start-Job -InitializationScript $Functions `
    -ScriptBlock $ExecutionBlock -ArgumentList $i | 
        Wait-Job | Receive-Job

或像这样使用 using 修饰符(学分转到 Eris

...
FOO -myArg $using:i
...