2017-10-17 63 views
0

我無法理解Powershell中的參數傳遞行爲。動態構建的Powershell命令 - 參數傳遞問題

說,我有一個腳本callScript.ps1

param($a="DefaultA",$b="DefaultB") 
echo $a, $b 

說,另一個腳本調用callScript.ps1

.\callScript.ps1 
# outputs DefaultA followed by DefaultB as expected 
.\callScript.ps1 -a 2 -b 3 
# outputs 2 followed by 3 as expected 
$arguments='-a 2 -b 3' 
callScript.ps1 $arguments 
# I expected output as previous statement but it is as follows. 
# -a 2 -b 3 
# DefaultB 

如何通過動態構建命令來運行PowerShell腳本? 您能解釋爲什麼$arguments被解釋爲$a變量的腳本爲callScript.ps1

+0

你傳入一個字符串,你腳本期​​待2個參數。因此它回退到DefaultB(缺少)。我認爲你應該考慮重構你的函數來接受一個數組。至少如果你真的需要傳遞參數作爲單個參數。 – Akaino

回答

1

這裏發生了什麼是你傳遞一個字符串:

'-a 2 -b 3'作爲參數$a

需要帕拉姆內指定的值,如果你真的需要,你必須這樣做上述(肯定有,雖然有更好的方式),你可以做到這一點使用Invoke-Expression(短iex

function doprint { 
    param($a,$b) 
    $a ; $b 
} 

$arg = '-a "yes" -b "no"' 

"doprint $arg" | iex 

你也可以改變你的函數採取值的數組像這樣:

function doprint { 
    param([string[]]$a) 
    $a[0] ; $a[1] 
} 

$arg = @('yes','no') 

doprint $arg 
1

正如已經在暗示,你不能傳遞一個字符串作爲你的腳本需要兩個參數 - 串取作PARAM $a輸入,同時PARAM $b採用默認值。

然而,您可以構建一個包含您的參數的簡單哈希表,然後使用splatting將它們傳遞給腳本。

你的代碼的變化是最小的:

[email protected]{a="2";b="3"} 

callScript.ps1 @arguments