2012-06-28 5 views
7

Powershellコマンドレットで関連する関数を公開すると、プロパティ名とサマリーヘルプを共有して、これらのコマンドレットをアセンブリ内で正規化できますか?Powershellのコマンドレット間でプロパティやコメントをC#で共有できますか?

これは派生クラスで行うことができますが、共有するプロパティが異なる複数のコマンドレットが存在する場合は、この解決策が最も厄介です。

これは非常に簡単な例です。プロパティ 'Name'と関連するすべてのコメントを共有して、作成しているN個のコマンドレット間で同じであるようにしたいと思いますが、C#でこれを行う良い方法は考えられません。理想的には、共有は、必須または位置などのパラメータ属性の指定を可能にします。

namespace FrozCmdlets 
{ 
using System.Management.Automation; 

/// <summary> 
/// Adds a new froz to the system. 
/// </summary> 
[Cmdlet(VerbsCommon.Add, "Froz")] 
public class AddFroz : Cmdlet 
{ 
    /// <summary> 
    /// The name of the froz. 
    /// For more information on the froz, see froz help manual. 
    /// </summary> 
    [Parameter] 
    public string Name { get; set; } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     // Add the froz here 
    } 
} 

/// <summary> 
/// Removes a froz from the system. 
/// </summary> 
[Cmdlet(VerbsCommon.Remove, "Froz")] 
public class RemoveFroz : Cmdlet 
{ 
    /// <summary> 
    /// The name of the froz. 
    /// For more information on the froz, see froz help manual. 
    /// </summary> 
    [Parameter] 
    public string Name { get; set; } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     // Remove the froz here 
    } 
} 
} 
+0

派生したくない場合(理由は不明です)、コメントを共有する最良の方法は、XMLインクルード(フレームワークソースコードを参照)を使用することです。コードのドキュメントはコードの外に保管し、他の人が(必要に応じて)記述し、維持することができ、クラスやアセンブリ間で共有することができます。 –

+0

@Adriano XMLを使ってコメントを共有することを検討していただきありがとうございます。派生したくないという背後にある理由は、きれいにすることが可能であるということです。コマンドレットAがP1、P2を使用し、コマンドレットBがP2を使用する場合、P3およびコマンドレットCはP1、P3を使用し、P1、P2、P3を派生させて共有する方法はありません。 私は、これらのプロパティを共有するという私の考えは十分に確立されていない可能性もあることを認識しています。何か変わるたびにN個の場所を更新するのはちょっと面倒になりました。コピーと貼り付けのコードが嫌いです。 – pennyowe

+0

ああ、そうだよ!私はちょうど彼らが多くの共有プロパティを持っていると思った私がそれをすると思う唯一の方法は、インクルード経由です(しかしコメントのためだけにOKです)。いつか(多分...)私たちは複数の継承を持っています... –

答えて

3

はい、パラメータの共通基本クラスから継承せずにこれを行う方法があります。それはよく文書化されていませんが、IDynamicParameters.GetDynamicParametersメソッドの注釈でのみ示唆されています。ここでは、トピックのより詳細な扱いです。

まず、[パラメータ]でプロパティとして宣言され、あなたの一般的なパラメータを持つクラスを作成属性:

internal class MyCommonParmeters 
{ 
    [Parameter] 
    public string Foo { get; set; } 
    [Parameter] 
    public int Bar { get; set; } 
    ... 
} 

そして、これらの共通のパラメータを使用したい各コマンドレットは、メンバーのインスタンスを返すためにIDynamicParametersインターフェイスを実装する必要がありますMyCommonParametersクラスの:

[Cmdlet(VerbsCommon.Add, "Froz")] 
public class AddFroz : PSCmdlet, IDynamicParameters 
{ 
    private MyCommonParmeters MyCommonParameters 
     = new MyCommonParmeters(); 

    object IDynamicParameters.GetDynamicParameters() 
    { 
     return this.MyCommonParameters; 
    } 
    ... 

このアプローチでは、PowerShellのコマンドパラメータのバインダーは、彼らがCMDLのメンバーであるかのようMyCommonParametersインスタンスのパラメータを見つけて移植しますetクラス。

+0

非常にクールです - ありがとうBurt!私はこれを試してみる機会はまだありませんでしたが、それは請求に合うようです。 – pennyowe

関連する問題