我有一个脚本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
我怎样才能做到这一点?请注意,实际的命令行更复杂,并且可能具有未知长度。
答案 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]