2017-08-13 10 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

'$((取得項目関数:/ 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() 
関連する問題