programing

상호 배타적 파워셸 파라미터

linuxpc 2023. 9. 8. 21:12
반응형

상호 배타적 파워셸 파라미터

시나리오

  • 저는 Visual Studio 2008과 를 사용하여 파워셸 2.0용 cmdlet을 작성하고 있습니다.NET 3.5
  • cmdlet에는 3개의 인수가 필요합니다.

제가 의도한 cmdlet 문법은 다음과 같습니다.

cmdletname [foo|bar] p1, p2
  • 사용자가 "-foo" 또는 "-bar" 값을 지정해야 하지만 둘 다 함께 지정할 수는 없습니다.

유효 입력 예시

cmdletname -foo xxx -p1 hello  -p2 world
cmdletname -bar yyy -p1 hello  -p2 world

잘못된 입력의 예

cmdletname -foo xxx -bar yyy -p1 hello  -p2 world

나의 질문

  • 제 질문은 이것을 어떻게 하면 저를 위해 모든 점검을 할 수 있는지 혹은 그것이 가능한지에 대한 것입니다.
  • 저는 foo와 bar에 대한 두 개의 옵션 파라미터만 사용할 수 있다는 것을 알고 있고 수동으로 오류 검사를 할 수 있습니다.현재 그렇게 실행하고 있습니다.
  • 또는 다양한 방법에 대한 제안에 관심이 있습니다.

매개 변수 특성을 사용하여 여러 매개 변수 집합을 선언할 수 있습니다.그런 다음 서로 다른 매개변수 집합에 대해 상호 배타적인 매개변수를 할당하기만 하면 됩니다.

편집:

이는 'about_'에도 나와 있습니다."ParameterSetName Named Argument" 섹션 아래의 Functions_Advanced_Parameters.이것은 다양한 매개변수 집합이 다음과 같이 cmdlet으로 처리되는 방식입니다.Get-Random(상호 배타적인 매개변수를 가지는 경우):

> get-random -input 4 -max 77
Get-Random : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:11
+ get-random <<<<  -input 4 -max 77
    + CategoryInfo          : InvalidArgument: (:) [Get-Random], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.GetRandomCommand

함수에서 수행하는 예는 다음과 같습니다.

function exclusive_params() { 
    param( 
        [parameter(ParameterSetName="seta")]$one,
        [parameter(ParameterSetName="setb")]$two, 
        $three 
    )
    "one: $one"; "two: $two"; "three: $three" 
}

매개변수들은one그리고.two는 서로 다른 매개 변수 집합에 있으므로 함께 지정할 수 없습니다.

> exclusive_params -one foo -two bar -three third
exclusive_params : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:17
+ exclusive_params <<<<  -one foo -two bar -three third
    + CategoryInfo          : InvalidArgument: (:) [exclusive_params], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,exclusive_params

겟-랜덤에서 했던 것과 같은 오류입니다.그러나 매개변수는 독립적으로 사용할 수 있습니다.

> exclusive_params -one foo -three third
one: foo
two:
three: third

...또는:

> exclusive_params -two bar -three third
one:
two: bar
three: third

다음은 PowerShell Community Extensions의 cmdlet에서 가져온 ParameterSetName을 사용하는 예입니다.그건 그렇고, 아이디어는 PSCX 소스 코드를 찾아보면 됩니다.

[Cmdlet(VerbsCommon.Set, PscxNouns.Clipboard, 
        DefaultParameterSetName = ParamSetText)]
[Description("Copies the item in the system clipboard.")]
[RelatedLink(typeof(GetClipboardCommand))]
[RelatedLink(typeof(OutClipboardCommand))]
[RelatedLink(typeof(WriteClipboardCommand))]
public class SetClipboardCommand : ClipboardCommandBase
{
    ... fields elided

    const string ParamSetRtf = "Rtf";
    const string ParamSetHtml = "Html";
    const string ParamSetText = "Text";
    const string ParamSetFiles = "Files";
    const string ParamSetImage = "Image";
    . 
    [AllowNull]
    [Parameter(ValueFromPipeline = true, ParameterSetName = ParamSetImage)]
    public Image Image { get; set; }
    . 
    [AllowNull]
    [AllowEmptyCollection]
    [Parameter(ValueFromPipeline = true, ValueFromRemainingArguments = true,
               ParameterSetName = ParamSetFiles)]
    public FileSystemInfo[] Files { get; set; }
    . 
    [AllowNull]
    [AllowEmptyString]
    [Parameter(ValueFromPipeline = true, ValueFromRemainingArguments = true,
               ParameterSetName = ParamSetText)]
    public string Text { get; set; }
    . 
    [Parameter(ValueFromPipeline = true, ValueFromRemainingArguments = true,
               ParameterSetName = ParamSetHtml)]
    public string Html { get; set; }
    .         
    [Parameter(ValueFromPipeline = true, ValueFromRemainingArguments = true,
               ParameterSetName = ParamSetRtf)]
    public string Rtf { get; set; }
    . 
    protected override void ProcessRecord()
    {
        ...
    }
    .
    protected override void EndProcessing()
    {
        ExecuteWrite(delegate
        {
            switch (ParameterSetName)
            {
                case ParamSetFiles:
                    if (Paths.Count == 0)
                        WinFormsClipboard.Clear();
                    else
                        WinFormsClipboard.SetFileDropList(_paths);
                    break;

                case ParamSetImage:
                    if (Image == null)
                        WinFormsClipboard.Clear();
                    else
                        WinFormsClipboard.SetImage(_image);
                    break;

                case ParamSetRtf:
                    SetTextContents(Rtf, TextDataFormat.Rtf);
                    break;

                case ParamSetHtml:
                    SetTextContents(Html, TextDataFormat.Html);
                    break;

                default:
                    SetTextContents(Text, TextDataFormat.UnicodeText);
                    break;
            }
        });
    }
    ...
}

cmdlet은 일반적으로 PowerShell이 모호성이 있을 때 사용할 "default" 파라미터 세트를 결정하는 데 도움이 되는 기본 ParameterSetName을 선언합니다.나중에 필요한 경우 이를 쿼리하여 어떤 매개 변수 집합이 적용되는지 확인할 수 있습니다.EndProcessing() override에서 위의 스위치 문과 같은 ParameterSetName입니다.

여기에 왔는데 추가적인 요구사항이 있습니다. 상호 배타적 매개변수(선택사항)입니다.

여기 이 게시물을 통해 절반의 답을 찾을 수 있었습니다.그래서 저는 누군가가 같은 요구사항을 가지고 있을 경우를 대비해 전체 답변을 여기에 게시하려고 생각했습니다.

아래 코드는 Powershell 스크립트 상단에 사용하여 LaunchAsAdmin 및 LaunchAsCouponBrowser가 상호 배타적인 4개의 옵션 매개 변수를 가질 수 있으며 토큰 및 WorkstationName도 옵션이지만 다른 매개 변수와 결합할 수 있습니다.

[CmdletBinding(DefaultParametersetName="default")]                  
Param(
    [string]$token,
    [string]$WorkstationName,
    [parameter(ParameterSetName="seta")][switch]$LaunchAsAdmin,
    [parameter(ParameterSetName="setb")][switch]$LaunchAsCouponBrowser  
)

언급URL : https://stackoverflow.com/questions/1767219/mutually-exclusive-powershell-parameters

반응형