如何将参数列表保存在变量中

时间:2013-06-19 11:06:13

标签: powershell parameter-passing

我有一个脚本internal.ps1,它接受​​某些参数:

param ($paramA, $paramB)
Write-Host $PSBoundParameters

调用它的脚本caller.ps1

.\internal -paramA A -paramB B

效果很好:

PS C:\temp> .\caller
[paramA, A] [paramB, B]    <<<< bounded to both params

但是,在调用者中,我想将参数保留在var中的内部,并在以后使用它。但是,这不起作用:

$parms = "-paramA A -paramB B"
# Later...
.\internal $parms

Result: [paramA, A -paramB B]   <<<<< All got bounded to ParamA

也没有使用数组:

$parms = @("A", "B")
# Later...
.\internal $parms

Result: [paramA, System.Object[]]  <<<< Again, all bound to ParamA

我怎样才能做到这一点?请注意,实际的命令行更复杂,并且可能具有未知长度。

3 个答案:

答案 0 :(得分:5)

splatting operator(@)应该做你需要的。 首先考虑这个简单的函数:

function foo($a, $b) { "===> $a + $b" }

使用显式参数调用会产生您期望的结果:

foo "hello" "world"
===> hello + world

现在将这两个值放在一个数组中;正如您所观察到的那样,传递正常数组会产生不正确的结果:

$myParams = "hello", "world"
foo $myParams
===> hello world +

但是,请改变阵列,然后获得所需的结果:

foo @myParams
===> hello + world

这适用于脚本和函数。回到你的脚本,结果如​​下:

 .\internal @myParams
[paramA, hello] [paramB, world]

最后,这将适用于任意数量的参数,因此需要了解它们的先验知识。

答案 1 :(得分:0)

powershell -file c:\temp\test.ps1 @("A","B")

powershell -command "c:\temp\test.ps1" A,B

答案 2 :(得分:0)

您的脚本需要2个参数,但您之前的尝试只传递一个参数(分别是字符串和数组)。这样做:

$parms = "A", "B"
#...
.\internal.ps1 $parm[0] $parm[1]