2017-08-13 31 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()