2009-06-02 15 views
3

私は、高度な関数を動的に構築することを検討しています。私はこのためにNew-PSScriptを使用していますが、それは私が探しているすべての柔軟性を考慮していません。PowerShellメタプログラミング - 高度な関数の生成

私はおよそ機能、高度なパラメータについてはmanページを読んで、私はRuntimeDefinedParameterを使用できるかどうか、私は疑問に思って、次のサンプルコード

function Sample { 
     Param ([String]$Name, [String]$Path) 

     DynamicParam 
     { 
     if ($path -match "*HKLM*:") 
     { 
      $dynParam1 = new-object 
      System.Management.Automation.RuntimeDefinedParameter("dp1", 
      [Int32], $attributeCollection) 

      $attributes = new-object System.Management.Automation.ParameterAttribute 
      $attributes.ParameterSetName = 'pset1' 
      $attributes.Mandatory = $false 

      $attributeCollection = new-object 
      -Type System.Collections.ObjectModel.Collection``1[System.Attribute] 
      $attributeCollection.Add($attributes) 

      $paramDictionary = new-object 
      System.Management.Automation.RuntimeDefinedParameterDictionary 
      $paramDictionary.Add("dp1", $dynParam1) 

      return $paramDictionary 
     } End if 
     } 
    } 

を与えるヘルプ記事の最後に動的パラメータについて何かを見ました新しい機能を生成するための属性のコレクション

一部の準擬似コードは、このように見える場合があります。私が構築しようとしている2つの重要な機能は、New-ParameterとAdd-Parameterです。

$attributes1 = @{Mandatory=$true;Position=0;ValueFromPipeline=$true} 
$param1 = New-Paramater -name foo -attributes $attributes1 

$attributes2 = @{Mandatory=$true;Position=1} 
$param2 = New-Paramater -name bar -attributes $attributes2 

cd function: 
$function = new-item -name Get-FooBar -value {"there is a $foo in the $bar"} 
Add-Parameter -function $function -paramater $param1,$param2 

私は間違ったツリーを完全に吠えていますか?これを行うための他の方法がある場合は、私は可能性を広げています。

+0

@" } "ここでは欠落しています。いったんパラメータを追加したら、どうしますか?関数を変更することができない限り、または関数とパラメータのコレクションを繰り返し実行すると、... –

+0

フローがどのように動作するかは完全にはわかりません。私は最初に関数Definitonを作成し、その関数にパラメータを追加すると考えていました。 私の偽コードでは、後でパラメータとして添付する変数を使用する値を持つ関数を作成しました。 –

答えて

3

その場で関数を作成するために、関数を定義する文字列を作成し、それをコンパイルして関数プロバイダに追加するためにInvoke-Expressionを呼び出します。これは私の意見では、オブジェクトモデルを扱うよりもさらに強力です。

$ F1 = @ " 機能新モーター() { "これが私の新しいモータである私がいることを見ることができる唯一のこと

起動-式$ F1