상호 배타적 파워셸 파라미터
시나리오
- 저는 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
'programing' 카테고리의 다른 글
다중 행 텍스트에 타원 적용 (0) | 2023.09.08 |
---|---|
ORA-01219: 데이터베이스가 열리지 않음: 고정 테이블/뷰에서만 쿼리가 허용됨 (0) | 2023.09.08 |
Oracle BLOB 필드에서 파일을 추출하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
아이폰에서 방향 변경 시 웹 앱의 스케일/줌을 재설정하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
POST JSON with MVC 4 API Controller (0) | 2023.09.08 |