C # Powershell Commandlet для работы с двумя параметрами, но можно указать не более одного - PullRequest
0 голосов
/ 08 октября 2019

Я реализую командлет Powershell в C #. Командлет может быть передан два параметра. Оба помечены как необязательные (поскольку я заранее не знаю, будет ли пользователь выдавать Get-MsiInstalled -Product "0449F3E3-2337-45EF-BE77-60F4B9CD8822" или Get-MsiInstalled -MsiFile "C:filePath\file.msi".

. Более того, если пользователь ничего не дает и выдает Get-MsiInstalled, исключение будетБрошенный (должен быть указан либо параметр MSI, либо Product).

В настоящий момент реализация не может ожидать не более одного параметра. Вместо этого пользователь может предоставить оба параметра, что является недопустимым вызовом.

public class GetAHPIsMsiInstalled : Cmdlet
{      
    [Parameter(Mandatory = false, ValueFromPipeline = true,
        HelpMessage = "Product Guid to search Installable Package.", Position = 1)]
    [UsedImplicitly]
    public string Product { get; set; }

    [Parameter(Mandatory = false, ValueFromPipeline = true, HelpMessage = "Installable Package to search.",
        Position = 1)]
    [UsedImplicitly]
    public string MsiFile { get; set; }

    protected override void BeginProcessing()
    {
        if (string.IsNullOrEmpty(Product) && string.IsNullOrEmpty(MsiFile))
            ThrowTerminatingError(new ErrorRecord(new
                    ParameterBindingException("At most one parameter must be provided"))

        base.BeginProcessing();
        ................................
     }
}

1 Ответ

1 голос
/ 08 октября 2019

ParameterSets - это способ указания взаимоисключающих наборов параметров.

Так, например, Get-Process можно вызывать с помощью -Name или -Id, но не обоими:

Get-Process [[-Name] <String[]>] [-ComputerName <String[]>] [-FileVersionInfo] [-Module] [<CommonParameters>]

Get-Process [-ComputerName <String[]>] [-FileVersionInfo] -Id <Int32[]> [-Module] [<CommonParameters>]

Get-Process [-ComputerName <String[]>] [-FileVersionInfo] -InputObject <Process[]> [-Module] [<CommonParameters>]

Get-Process -Id <Int32[]> -IncludeUserName [<CommonParameters>]

Get-Process [[-Name] <String[]>] -IncludeUserName [<CommonParameters>]

Get-Process -IncludeUserName -InputObject <Process[]> [<CommonParameters>]

Вы можете указать их в C # или непосредственно в PowerShell

...