开始作业-参数的位置顺序

时间:2019-02-28 11:03:08

标签: powershell

使用Start-Job时,我试图理解参数的正确顺序。为PowerShell作业提供参数的正确方法是什么?

我希望它会打印hello world,但它会打印world hello

这里是Param()还是-ArgumentList的问题?

$foo = "hello"
$bar = "world"

$job = Start-Job -ScriptBlock {
    Param(
        $foo,
        $bar
    )
    Write-Host $foo
    Write-Host $bar
} -ArgumentList $bar, $foo

Receive-Job $job

输出:

world
hello

1 个答案:

答案 0 :(得分:2)

参数-ArgumentList的参数是一个数组,其值按位置顺序传递到脚本块内定义的参数。您对获得的结果感到困惑,因为您显然希望将全局变量映射到在脚本块中定义的参数名称。那不是这样的。

为了更好地说明示例中发生的情况,让我们在脚本块和全局范围中使用不同的变量名称:

$a = "hello"
$b = "world"

$job = Start-Job -ScriptBlock {
    Param(
        $c,
        $d
    )
    Write-Host $c
    Write-Host $d
} -ArgumentList $b, $a

本质上,参数的名称与全局范围内的变量的名称无关。

在将$b, $a而不是$a, $b传递到脚本块时,您正在切换值,因此$b的值将传递给$c,并且该值$a的值传递到$d

通常,人们会使用splatting将值映射到特定的命名参数。但是,这在这里行不通,因为-ArgumentList需要一个值数组,而不是哈希表。如果您不清楚位置参数和命名参数之间的区别,请查看documentation

如果要在脚本块的内部和外部使用相同的变量名,可以使用using:范围限定符,而不是将变量作为参数传递:

$a = "hello"
$b = "world"

$job = Start-Job -ScriptBlock {
    Write-Host $using:a
    Write-Host $using:b
}