2013-06-19 30 views
4

我有一个脚本internal.ps1其接受某些PARAMS参数列表:如何保持在一个变量

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的内部,并使用它lat呃。然而,这并不工作:

$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 

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

回答

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] 

最后,这会为参数的任意数量的工作,所以知道是他们需要的先验知识。

+0

很好,谢谢! – Jonathan

0

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

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

0

你的脚本需要2个参数,但是你以前曾试图通过只是一个单一的一个(一个字符串和一个数组分别)。这样做:

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

好的,但是当我不知道参数的长度时,我该如何使用它?我可以用$ parms var以某种方式表示paramA与A等的绑定(请参阅编辑的使用问题)? – Jonathan

+0

你想用这个解决什么实际问题? –