C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/06/08 02:49
スクリプトブロックのパラメータ情報を取得する関数。

[ パラメータ ]
target
対象のスクリプトブロック。

paramName
取得するパラメータの名前。
省略した場合は全てのパラメータを取得。


[ 戻り値 ]
スクリプトブロックのパラメータ情報。


[ Get-Parameter ]
function Get-Parameter
{
    param ([ScriptBlock]$target, [string]$paramName)
    trap { break; }
   
    if ($() -eq $target) { throw New-Object "ArgumentException" @("target"); }
   
    $parameterMetadataProperty = [ScriptBlock].GetProperty("ParameterMetadata", [System.Reflection.BindingFlags]"NonPublic, Instance");
    $parameterMetadata = $parameterMetadataProperty.GetValue($target, $());
    $bindableParametersProperty = $parameterMetadata.GetType().GetProperty("BindableParameters", [System.Reflection.BindingFlags]"NonPublic, Instance");
    $bindableParameters = $bindableParametersProperty.GetValue($parameterMetadata, $());
   
    $compiledCommandParameterType = [Type]::GetType("System.Management.Automation.CompiledCommandParameter");
    $typeProperty = $compiledCommandParameterType.GetProperty("Type", [System.Reflection.BindingFlags]"NonPublic, Instance");
   
    $result =
        $bindableParameters.GetEnumerator() |
            ? { (("$paramName" -eq "") -or ($_.Key -eq $paramName)); } |
            % {
                $paramInfo = New-Object "PSObject";
                Add-Member -InputObject $paramInfo -Name "Name" -Value $_.Key -MemberType "NoteProperty";
                Add-Member -InputObject $paramInfo -Name "Type" -Value $typeProperty.GetValue($_.Value, $()) -MemberType "NoteProperty";
                return $paramInfo;
            };
    return $result;
}


[ 使用例 ]
Get-Parameter ${function:Get-Parameter};
Get-Parameter ${function:Get-Parameter} "paramName";



【 ダウンロード 】
自作の PowerShell 関数は、以下の記事からまとめてダウンロードできます。

YokoKen.PowerShell.Scripts











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/217-a8496001