2013-06-19 90 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

你想用這個解決什麼實際問題? –