【问题标题】:Elegant way to get around scoping issues with powershell jobs解决 Powershell 作业范围问题的优雅方法
【发布时间】:2016-08-27 18:45:30
【问题描述】:

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

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

这就是我所拥有的:

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 没有传递给函数。我该怎么做?

【问题讨论】:

  • 尝试用FOO -myArg $using:i替换FOO -myArg $i和/或使用GetNewClosure()

标签: powershell closures powershell-2.0 powershell-3.0 jobs


【解决方案1】:

你必须像这样将它作为参数传递

$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
...

【讨论】:

  • 这和说 javascript 闭包一样吗?
  • 我得到了这个错误:Start-Job : Cannot bind argument to parameter 'ScriptBlock' because it is null
  • 好吧,我无法用null 重现您的问题,但确实我的代码没有按预期工作 - 抱歉。我更新了我的答案,因为您似乎必须使用参数将信息传递给您的工作
  • 好的,使用脚本块参数相当于$using: 还是更安全或更快? (对于我的特定用例)。因为两者似乎都在做我想做的事
  • 不适合您的用例,尤其是因为启动工作本身是脚本的最大工作量:) 总的来说,我认为这两种方法之间没有很大差异(但我不'不确定)因为无论如何数据都必须以某种方式传递给工作。我认为using 更简洁方便,但需要>= PowerShell 3.0
猜你喜欢
  • 2010-10-04
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多