PowerShell cmdlet 매개 변수 값이 지정되었는지 어떻게 결정합니까?
-
05-07-2019 - |
문제
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");