如何在 powershell cmdlet 中使用 ParameterSetName 进行唯一组合

How to use ParameterSetName for unique combination in powershell cmdlet

我正在准备 PowerShell cmdlet,必须为输入设置唯一的组合,这样一次只能应用给定的组合,否则它会抛出 parameter set cannot be resolved using the specified named parameters.

public abstract class ServerCmdletBase
{
    public const string IdParameterSetName = "Id";
    public const string InputObjectParameterSetName = "InputObject";

    [Parameter(Mandatory = true, ParameterSetName = IdParameterSetName)]
    public int[] Id { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSetName)]
    public string[] InputObject { get; set; }

    ...
    ...
}
public class EditServerCmdlet : ServerCmdletBase
{
    public const string ConnectionStringParameterSetName = "ConnectionString";
    public const string PasswordParameterSetName = "Password";

    [Parameter(Mandatory = true, ParameterSetName = ConnectionStringParameterSetName)]
    [Parameter(ParameterSetName = IdParameterSetName )]
    [Parameter(ParameterSetName = InputObjectParameterSetName )]
    public string ConnectionString { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = PasswordParameterSetName)]
    [Parameter(ParameterSetName = IdParameterSetName )]
    [Parameter(ParameterSetName = InputObjectParameterSetName )]
    public string Username { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = PasswordParameterSetName)]
    [Parameter(ParameterSetName = IdParameterSetName )]
    [Parameter(ParameterSetName = InputObjectParameterSetName )]
    public string Password { get; set; }

    ...
    ...
}

最终目标是 -Id-InputObject 不应同时使用。对于给定的输入(Id 或 InputObject),不应同时使用 -ConnectionString-Username, -Password。因此共有 4 个独特的组合。

我在这里使用 ParameterSetName 但无法正常工作。上面的代码只适用于 Id 和 InputObject,它不能处理 ConnectionString/Username & Password。请告知正确的方法。非常感谢!

就像您已经确定了 4 种不同的组合,您还需要 4 种不同的参数集。 1个组合对应1组参数

由于您使用的是基础 class 我认为没有一种简单的方法可以重用代码。因此,如果扩展 class 需要扩展可能集的数量,并且这些集需要包含来自“基本集”的参数,则您需要覆盖我认为的属性。

从制作它们开始 virtual:

public abstract class ServerCmdletBase
{
    public const string IdParameterSetName = "Id";
    public const string InputObjectParameterSetName = "InputObject";

    [Parameter(Mandatory = true, ParameterSetName = IdParameterSetName)]
    public virtual int[] Id { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSetName)]
    public virtual string[] InputObject { get; set; }

    ...
    ...
}

现在,创建 4 个不同的集合名称并使用这些名称注释属性:

public class EditServerCmdlet : ServerCmdletBase
{
    public const string IdConnStrParameterSetName = IdParameterSetName + "ConnectionString";
    public const string InObjConnStrParameterSetName = InputObjectParameterSetName + "ConnectionString";
    public const string IdPwParameterSetName = IdParameterSetName + "Password";
    public const string InObjPwParameterSetName = InputObjectParameterSetName + "Password";

    [Parameter(Mandatory = true, ParameterSetName = IdConnStrParameterSetName)]
    [Parameter(Mandatory = true, ParameterSetName = IdPwParameterSetName)]
    public override int[] Id { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = InObjConnStrParameterSetName)]
    [Parameter(Mandatory = true, ParameterSetName = InObjPwParameterSetName)]
    public override string[] InputObject { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = IdConnStrParameterSetName)]
    [Parameter(Mandatory = true, ParameterSetName = InObjConnStrParameterSetName)]
    public string ConnectionString { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = IdPwParameterSetName)]
    [Parameter(Mandatory = true, ParameterSetName = InObjPwParameterSetName)]
    public string Username { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = IdPwParameterSetName)]
    [Parameter(Mandatory = true, ParameterSetName = InObjPwParameterSetName)]
    public string Password { get; set; }

    ...
    ...
}

注意:这意味着IdParameterSetNameInputObjectParameterSetName基本上没有被使用。因此,除非您有其他 class 派生自 ServerCmdletBase 不需要 需要添加其他集,否则您可能可以删除这两个“基本集” .