2009-07-29 5 views
5

PowerShell 1.0에서 enum 형식의 cmdlet 매개 변수가있는 경우 사용자가 cmdlet 명령 줄에서 해당 매개 변수를 지정했는지 테스트하는 데 권장되는 방법은 무엇입니까? 예를 들면 다음과 같습니다.PowerShell Cmdlet 매개 변수 값이 지정되었는지 어떻게 확인합니까?

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 } 

class DoSomethingCommand : PSCmdlet 
... 
private MyEnum isEnabled; 

[Parameter(Mandatory = false)] 
public MyEnum IsEnabled 
{ 
    get { return isEnabled; } 
    set { isEnabled = value; } 
} 

protected override void ProcessRecord() 
{ 
    // How do I know if the user passed -IsEnabled <value> to the cmdlet? 
} 

더미 값으로 isEnabled를 시드하지 않아도이 작업을 수행 할 수 있습니까? 기본적으로 0과 같을 것이고 모든 매개 변수를 시드하거나 내 열거 형에 더미 값을 추가하지 않아도됩니다. 나는 많은 cmdlets에 100 개의 매개 변수가있을 수 있으므로 더 좋은 방법이 있어야합니다. 이것은 this question과 관련이 있습니다. 그러나 나는 이것을 수행하는 더 깨끗한 방법을 찾고있었습니다. 감사합니다. .

+0

@Jack 스트로 는 "잠재적으로 매개 변수의 100의 많은 cmdlet을 가지고"한 경우에는 해당 기능의 최대의 일부를 깨는보고 할 수 있습니다. PowerShell의 주요 이점 중 하나는 검색 가능성이며 매개 변수가 많으면 자체 검색이 훨씬 어려워집니다. –

+0

@Steven, 죄송합니다. 오해의 소지가 있습니다. 100 개의 매개 변수가있는 각 cmdlet은 아니지만 :) 많은 매개 변수가 나오는 많은 cmdlet입니다. 당신의 의견에 감사드립니다. –

답변

8

이 경우, 나는 열거 형 예를 들어, 주위에 널 (NULL) 래퍼를 사용합니다

[Parameter(Mandatory = false)] 
public MyEnum? IsEnabled { get; set; } 

참고? MyEnum의 수정 자. 이과 같이 설정되어있는 경우 그럼 당신은 테스트 할 수 있습니다

if (this.IsEnabled.HasValue) { ... } 
+0

바로 그게 내가 찾고있는 것입니다. 감사. 실제로 지역 변수를 만들지 만, nullable 유형이 아니라 작동합니다. –

1

값 0을 알 수 없음 또는 이와 비슷한 이름으로 열거 형을 수정하는 것만 알 수 있습니다.

문제는 열거 형은 백그라운드의 정수이며 정수는 값 유형입니다. 불행한 결과는 그들이 가치를 가질 필요가 있고 그 가치는 기본적으로 0입니다.

+0

@Josip, 고마워요. 요점을 봅니다. x0n에 대한 내 의견보기. –

4

PowerShell을 제외하고, 그런 식으로 0을 사용하는 것은 결코 좋은 스타일이 아닙니다. 가장 적절한 기본값으로 항상 0을 사용해야합니다. 이 경우 가장 적절한 기본값은 "설정 해제"와 같아야합니다.

궁극적으로 이것은 PowerShell 및 .NET의 올바른 코딩 방법과 관련이 없습니다.

  • Oisin는
+0

@ x0n : 답변 해 주셔서 감사합니다. enum 값에 0을 사용할지 여부는 논란의 여지가 있지만 내 기존 제품에는 enum 값에 대해 많은 0 값이 있습니다. 내 광범위한 질문은 패턴 cmdlet 개발자가이 상황에서 사용하는지 여부입니다. ProcessRecord()의 객체에 매개 변수 값을 적용하기 전에 각 매개 변수에 대해 기본값 인 '지정되지 않은'값을 사용하여 테스트하십시오. 이것은 많은 매개 변수 유형을 가진 대형 제품의 경우 다루기 힘들 수 있습니다. –

+2

powershell의 v2.0에서 새로운 속성이 추가되었습니다. this.MyInvocation.BoundParameters 여기서 "this"는 PSCmdlet입니다.이것은 cmdlet에 바인딩 된 매개 변수 이름과 값의 키/값 쌍의 해시 테이블입니다. 열거 형이 지정되면이 사전에 있습니다. 기본값으로 설정되어 있으면 기본값은 아닙니다. 나는 v1.0 – x0n

+0

x0n에서 동일한 작업을 수행 할 문자열 해킹 이외의 것을 전혀 모르고 있습니다. 덕분에 2.0 속성을 보았습니다. 불행히도 지금은 1.0에 대해 코딩해야합니다. Keith의 답변은 nullable 래퍼를 사용하여 정확히 내가 찾고있는 답변이라고 생각합니다. –

1

을 나는이 스레드가 지금은 조금 오래 알고 있지만, 이렇게하는 가장 좋은 방법은 SwitchParameter 유형을 사용하여 매개 변수를 선언하는 것입니다. 그런 다음 사용자가 -IsEnabled를 전달할 필요가 없으면 -Enabled와 같은 것을 매개 변수로 추가합니다.

그런 다음 매개 변수의 .IsPresent 속성을 테스트하여 호출자가 추가되었는지 확인합니다 (cmdlet 호출에 사용됨).

+0

@Darren : 그것은 확실히 bool params에서 작동하지만 선택적 bool이 아닌 params에 대한 해결책을 찾고있었습니다. Nullable 형식은 잘 작동하는 것 같습니다. 물론 PS v2에는 이제 cmdlet에서 사용할 수있는 params 사전이 있으므로 아마도 그렇게 할 수 있습니다. 감사. –

0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled"); 
+0

위치 매개 변수로는 올바르게 작동하지 않습니다. BoundParameters의 Name에 의해 발견되지 않습니다 만, 값이 지정됩니다. –

관련 문제