解决powershell作业范围界定问题的优雅方式
我在单独的文件中有函数,我需要在一个主文件中作为作业运行 我需要能够将这些函数传递给参数 这就是我所拥有的: testJobsMain.ps1:解决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
$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