如何以编程方式确定函数参数的默认值?
How can I programmatically determine the default value of a function parameter?
考虑以下函数:
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
似乎没有关于默认值的任何线索。
如何以编程方式确定函数参数的默认值?
您可以使用语法树来查找参数的默认值表达式。
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()
考虑以下函数:
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
似乎没有关于默认值的任何线索。
如何以编程方式确定函数参数的默认值?
您可以使用语法树来查找参数的默认值表达式。
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()