如何以编程方式确定函数参数的默认值?

时间:2017-08-13 17:04:12

标签: function powershell parameters default-value

考虑以下功能:

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

似乎没有任何关于默认值的线索。

如何以编程方式确定函数参数的默认值?

1 个答案:

答案 0 :(得分:3)

您可以使用语法树查找参数的默认值表达式。

{'data': ['pdf', 2, 4], 'next': {'data': ['csv', 1, 1], 'next': {'data': ['pdf', 234, 53], 'next': 
{'data': ['xml', 1, 2], 'next': {'data': ['pdf', 0, 1], 'next': None}}}}}

您可以使用语法树节点的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()