解决powershell作业范围界定问题的优雅方式

解决powershell作业范围界定问题的优雅方式,powershell,closures,powershell-2.0,powershell-3.0,jobs,Powershell,Closures,Powershell 2.0,Powershell 3.0,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

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

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

这就是我所拥有的:

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
PS> .\testjobsMain.ps1
zzzzzzz
zzzzzzz
zzzzzzz
zzzzzzz
func1.ps1

function FOO( $myArg ) { write-output $myArg }
功能2.ps1

function FOO2( $blah ) { write-output $blah }
这是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
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
或者像这样使用
使用
修饰符(贷项转到)

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

尝试用
FOO-myArg$using:i
和/或使用
GetNewClosure()替换
FOO-myArg$i
这与说javascript闭包相同吗?我使用以下方法得到此错误:
开始作业:无法将参数绑定到参数“ScriptBlock”,因为它为null
我无法用
null
重现您的问题,但实际上我的代码没有按预期工作-sry适用于此。我更新了我的答案,因为您似乎必须使用参数将信息传递给您的作业OK,使用scriptblock参数是否等同于使用:还是更安全或更快?(针对我的特定用例)。因为这两种方法似乎都不符合我的要求,特别是在启动作业本身是脚本中最大的工作量的情况下:)一般来说,我认为这两种方法之间没有太大的差异(但我不确定),因为数据必须以某种方式传递给作业。我认为使用更简洁、更方便,但需要>=PowerShell 3.0