2017-08-13 66 views
1

考慮以下功能:如何以編程方式確定函數參數的默認值?

function f {param($x = 42)} 

$x有42缺省值假設我有一堆的功能,我想以編程的測試,除其他事項外,它的參數,其默認值。其他的事情我能夠使用返回的使用以下命令之一的對象發現:

Get-Item function:/f | % Parameters | % x | % Attributes 
Get-Help f | % Parameters | % parameter 

這些命令的輸出如下:

Position      : 0 
ParameterSetName    : __AllParameterSets 
Mandatory      : False 
ValueFromPipeline    : False 
ValueFromPipelineByPropertyName : False 
ValueFromRemainingArguments  : False 
HelpMessage      : 
HelpMessageBaseName    : 
HelpMessageResourceId   : 
DontShow      : False 
TypeId       : System.Management.Automation.ParameterAttribute 

name    : x 
required   : false 
pipelineInput : false 
isDynamic  : false 
parameterSetName : (All) 
parameterValue : Object 
type    : @{name=Object} 
position   : 0 
aliases   : None 

似乎沒有被任何線索默認值。

如何以編程方式確定函數參數的默認值?

+2

'$((Get-Item獲取函數:/ F).ScriptBlock.Ast.Body.ParamBlock.Parameters.Where {$ _ Name.VariablePath.UserPath -eq 'X'})DefaultValue.SafeGetValue。 ()' – PetSerAl

+0

@PetSerAl這是值得一口氣投票。 – LotPings

+0

謝謝@PetSerAl。這樣可行。你能否讓它成爲答案,以便我能糾正錯別字? – alx9r

回答

3

您可以使用語法樹來查找參數的默認值表達式。

function f { 
    param(
     $x = 42, 
     $y = 6*7, 
     $z = (Get-Random) 
    ) 
} 

$Parameters = (Get-Item function:\f).ScriptBlock.Ast.Body.ParamBlock.Parameters 
$xDefaultValue = $($Parameters.Where{$_.Name.VariablePath.UserPath -eq 'x'}).DefaultValue 
$yDefaultValue = $($Parameters.Where{$_.Name.VariablePath.UserPath -eq 'y'}).DefaultValue 
$zDefaultValue = $($Parameters.Where{$_.Name.VariablePath.UserPath -eq 'z'}).DefaultValue 

您可以比使用SafeGetValue()語法樹節點的方法檢索常量值,但它不適用於表達式。

$xDefaultValue.SafeGetValue() 
$yDefaultValue.SafeGetValue() 
$zDefaultValue.SafeGetValue()