8

在 Powershell cmdlet 中公开一组相关函数时,是否可以共享属性名称和摘要帮助以在程序集中跨 cmdlet 规范这些函数?

我知道这可以通过派生类来完成,但是当有多个具有不同属性的 cmdlet 要共享时,这个解决方案充其量是尴尬的。

这是一个非常简单的例子。我想共享属性“名称”和所有相关注释,以便它们在我们生成的 N 个 cmdlet 中是相同的,但我想不出在 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
    }
}
}
4

1 回答 1

3

是的,有一种方法可以做到这一点,而无需从参数的公共基类继承。它没有很好的记录,仅在IDynamicParameters.GetDynamicParameters方法的注释中有所暗示。这是对该主题的更详细处理。

首先,创建一个类,将您的公共参数声明为具有 [Parameter] 属性的属性:

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

然后每个想要使用这些公共参数的 Cmdlet 都应该实现 IDynamicParameters 接口以返回 MyCommonParameters 类的成员实例:

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

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

使用这种方法,PowerShell 命令参数绑定器将查找并填充 MyCommonParameters 实例上的参数,就像它们是 Cmdlet 类的成员一样。

于 2014-07-15T03:50:54.620 回答