문제

PowerShell 1.0에서 열거 유형의 CMDLET 매개 변수가있는 경우 사용자가 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?
}

더미 값으로 씨앗을 씨앗으로 만들지 않고이 작업을 수행 할 수있는 방법이 있습니까? 기본적으로 그것은 0과 같으며 모든 매개 변수를 시드하거나 열거에 더미 값을 추가하고 싶지 않습니다. 나는 잠재적으로 얻었다 많은 100의 매개 변수를 가진 CMDLETS는 더 나은 방법이 있어야합니다. 이것은 관련이 있습니다 이 질문 그러나 나는 이것을하는 더 깨끗한 방법을 찾고있었습니다. 감사.

도움이 되었습니까?

해결책

이 경우 열거 유형 주위에 무효 래퍼를 사용합니다.

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

참고? myenum의 수정 자. 그런 다음 그렇게 설정되어 있는지 테스트 할 수 있습니다.

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

다른 팁

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

궁극적으로 이것은 PowerShell과 관련이 없으며 .NET를위한 좋은 코딩 관행과 관련이 없습니다.

  • 오이신

옵션으로 사용할 수 있습니다 $PSBoundParameters 방법으로 전달되는지 확인하는 수집.

다음과 같은 JSON 파일이 있다고 가정 해 봅시다. { "p1": "value1", "p2": "value2" } 그리고 우리는 매개 변수를 수락하는 함수를 만들고 싶습니다. p1 그리고 p2 그리고 업데이트 값 p1 그리고 p2 파일에서 함수로 전달되는 경우. 그 가치가 될 수 있다고 가정 해 봅시다 null 그리고 그 값을 null로 갖는 것은 그것들을 전달하지 않는 것과 같지 않습니다.

예를 들어 Update-Values -p1 $null 업데이트해야합니다 p1 에게 null 그리고 변하지 않아야합니다 p2.

그렇게하려면 매개 변수가 메소드로 전달되었는지 여부를 감지 할 수 있어야합니다.

예 - 매개 변수가 전달되는지 여부를 감지하는 방법, null을 값으로 받아 들일 수있는 선택적 매개 변수에 대해?

Function Update-Values ($p1, $p2) {
    If($PSBoundParameters.ContainsKey("p1")) {
        Write-Host "p1 passed"
    }
    else {
        Write-Host "p1 not passed"
    }
    If($PSBoundParameters.ContainsKey("p2")) {
        Write-Host "p2 passed"
    }
    else {
        Write-Host "p2 not passed"
    }
}

그런 다음 다음 매개 변수를 사용하여 함수를 실행하면 다음과 같습니다.

Update-Values -p1 $null
# Update-Values -p1 "something"

결과적으로 다음을 볼 수 있습니다.

p1 passed
p2 not passed

여기에서 블로그 게시물을 읽을 수 있습니다. 파라미터가 PowerShell cmdlet에 전달되는지 확인하는 방법.

내가 볼 수있는 유일한 것은 값 0을 알 수 없거나 그와 비슷한 이름을 지정하도록 열거를 수정하는 것입니다.

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

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

그런 다음 매개 변수의 .ispresent 속성을 테스트하여 발신자가 CMDLET 호출에 추가 된 지 확인하십시오.

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top