Как использовать ParameterSetName для уникальной комбинации в командлете powershell
Я работаю над подготовкой командлета PowerShell и должен установить уникальные комбинации для входных данных, чтобы одновременно можно было применить только заданную комбинацию, иначе она должна вызывать
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. Посоветуйте правильный подход. Большое спасибо!
1 ответ
Так же, как вы определили 4 разные комбинации, вам также нужны 4 разных набора параметров. 1 комбинация соответствует 1 набору параметров.
Поскольку вы используете базовый класс, я не думаю, что есть простой способ повторного использования кода. Поэтому, если расширяющему классу необходимо расширить количество возможных наборов, и эти наборы должны включать параметры из «базовых наборов», вам необходимо переопределить свойства, которые я считаю.
Начните с их изготовления
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; }
...
...
}
Примечание : это означает
IdParameterSetName
а также
InputObjectParameterSetName
по существу не используются. Итак, если у вас нет других классов, производных от
ServerCmdletBase
которым не нужно добавлять другие наборы, вы, вероятно, можете удалить эти два «базовых набора».