使用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
答案 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
}