8

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

これは派生クラスで実行できることはわかっていますが、共有するプロパティが異なる複数のコマンドレットがある場合、このソリューションはせいぜい扱いにくいものです。

これは非常に単純な例です。プロパティ 'Name' と関連するすべてのコメントを共有して、作成している N 個のコマンドレットで同じになるようにしたいのですが、C# でこれを行う良い方法が思いつきません。理想的には、任意の共有により、Mandatory や Position などの Parameter 属性を指定できるようになります。

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
    }
}
}
4

1 に答える 1

3

はい、パラメーターの共通基本クラスから継承せずにこれを行う方法があります。十分に文書化されておらず、IDynamicParameters.GetDynamicParametersメソッドのコメントで示唆されているだけです。ここでは、トピックのより詳細な処理を示します。

まず、[Parameter] 属性を持つプロパティとして宣言された共通パラメータを持つクラスを作成します。

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 コマンド パラメーター バインダーは、コマンドレット クラスのメンバーであるかのように、MyCommonParameters インスタンスのパラメーターを検索して設定します。

于 2014-07-15T03:50:54.620 に答える