함수에 필수 매개 변수에 null 전달
사실상 제 문제는 다음과 같습니다.
필수 매개 변수를 가진 함수를 가질 수 없으며 $null을 해당 매개 변수에 전달합니다.
Function Foo
{
Param
(
[Parameter(Mandatory = $true)][string] $Bar
)
Write-Host $Bar
}
Foo -Bar $null
이것은 돌아옵니다.foo : Cannot bind argument to parameter 'Bar' because it is an empty string.
마찬가지로 배열을 만드는 것도 실패합니다.
Function Foo
{
Param
(
[Parameter(Mandatory = $true)][string[]] $Bar
)
Write-Host $Bar
}
Foo -Bar 1, 2
> 1 2
Foo -Bar 1, 2, $null
> foo : Cannot bind argument to parameter 'Bar' because it is an empty string.
프로그래밍 용어로는 필수 nullable 매개변수를 허용하는 함수를 갖는 것은 전적으로 가능하지만, PowerShell에서는 그런 방법을 찾을 수 없습니다.
제가 그걸 어떻게 합니까?
[string] 매개 변수의 경우 [AllowEmptyString()] 매개 변수 속성을 사용하고 다른 유형의 경우 [AllowNull()] 매개 변수 속성을 사용할 수 있어야 합니다.예제에서 [Allow EmptyString()] 특성을 함수에 추가했습니다.
Function Foo {
Param
(
[Parameter(Mandatory = $true)]
[AllowEmptyString()] <#-- Add this #>
[string] $Bar
)
Write-Host $Bar
}
Foo -Bar $null
자세한 내용은 about_를 확인하세요.Functions_Advanced_Parameters 도움말 항목입니다.
변수 에 PowerShell $null 합니다)에 변수 합니다.[string] $null고가 ,[int] $null0다가 .이 하려면 몇 .다.
- 매개 변수 유형 제약 조건을 제거합니다.코드에서 $null을 확인한 후 원하는 유형으로 캐스팅할 수 있습니다.
- 시스템을 사용합니다.Nullable(이에 대한 다른 답변 참조).값 유형에만 적용됩니다.
- null을 허용해야 하는 필수 매개 변수가 없도록 함수 설계를 다시 생각해 보십시오.
에서 되었듯이,[AllowNull()]및/[AllowEmptyString()]솔루션의 일부이지만 몇 가지 사항을 고려해야 합니다.
문제의 예문이 활자 문자열인데도 제목의 문제는 활자에 대한 언급 없이 필수 매개변수에 null을 전달하는 방법이므로 답을 약간 확대해야 합니다.
먼저 PowerShell이 특정 유형에 $null 할당을 어떻게 처리하는지 살펴보겠습니다.
PS C:\> [int] $null
0
PS C:\> [bool] $null
False
PS C:\> [wmi] $null
PS C:\>
PS C:\> [string] $null
PS C:\>
결과 분석:
-
$null완전히[int]하다,환을 합니다.[int]이 있는0 -
$null에 이르기까지[bool]품 a를 합니다.[bool]이 있는False -
$null에 이르기까지[wmi]반품... 아무 것도 없어요.개체를 전혀 만들지 않습니다.다를 할 수 .([wmi] $null).GetType()합니다, . -
$null에 이르기까지[string]품 a를 합니다.[string]이 있는''(빈 문자열).다를 할 수 .([string] $null).GetType()그리고.([string] $null).Length
만약 에게 필수가 ,[int]만약 우리가 그 파라미터를 통과하지 못한다면 어떤 값을 갖게 됩니까?확인해 보겠습니다.
Function Foo {
Param (
[int] $Bar
)
Write-Host $Bar
}
Foo
> 0
이 [bool]False그리고 만약 그것이 a였다면.[string]e일 입니다.''
그래서 우리가 대부분의 표준 유형의 필수 매개변수를 가지고 그것을 할당할 때$null, 우리는 얻지 못하고 있습니다.$null의 ""을 의합니다 "" 합니다를 입력합니다.
예:
Function Foo {
Param (
[Parameter(Mandatory = $true)][int] $Bar
)
Write-Host $Bar
}
Foo -Bar $null
> 0
가 합니다.[AllowNull()]거기에 조금이라도 있지만, 그것은 여전히 a를 돌려줍니다.0.
A [string]는 필수 매개 변수에 빈 문자열을 허용하지 않는다는 점에서 약간 다르며, 이것이 문제의 예제가 실패하는 이유입니다.[AllowNull()]다와 $null그래서 우리는 사용할 필요가 있습니다.[AllowEmptyString()] 건 다른 건 실패할 겁니다
, 서는 ?[AllowNull()]'다를 을 알려드립니다.$nullint, boole, wmi으로?
bool nullable type "real"을(를) 하려면 nullable type 를 "real"로 합니다.$null그들에게 당신은 그들을 무효로 만들 필요가 있습니다.
Function Foo {
Param (
[Parameter(Mandatory = $true)][AllowNull()][System.Nullable[int]] $Bar
)
Write-Host $Bar
}
은 "" 합니다를 합니다.$null 때될 것입니다Write-Host.$nulln에 된다는 ''다시 하겠지만, 시,이지만,은 참".$null중인
nullable 과(와) 같은 :[wmi] (a는).을 사용할 수 class) 는 null 로 null 로합니다가 하므로 더 .[AllowNull()].
만드는 것에 대해서는.[string]정말로 무효가 될 수 없습니다. 아직도 저를 피하려고 합니다.
[System.Nullable[string]]
오류를 반환합니다.y가system.stringPowerShell에서는 그렇게 보지 않는 것 같지만, 이미 무효입니다.
편집
나는 방금 그것을 알아차렸습니다.
[bool] $null
에 강제로 들어가게 됩니다.False을 하는
Function Foo {
Param (
[bool] $Bar
)
$Bar
}
Foo -Bar $null
는 다음 오류를 던집니다.
Foo : Cannot process argument transformation on parameter 'Bar'. Cannot convert value "" to type "System.Boolean".
입니다를 에 더욱 왜냐하면 사용하기 때문입니다.[switch] 대신 위의 [bool]작동하다.
먼저 추가합니다.AllowNull특성:
Function Foo
{
Param
(
[Parameter(Mandatory = $true)][AllowNull()][string] $Bar
)
Write-Host $Bar
}
, ,$null할 때[string].다.)서(PowerShell 3(2012)후)를 합니다.[NullString]::Value다음과 같이:
Foo -Bar ([NullString]::Value)
수업에 대해서는 설명서를 참고하세요.
편집: 통화 사이트에서 보면 작동하는 것처럼 보이지만, 당신이 도착하는 즉시Write-Host 내 에 cmdlet,$Bar다시 빈 문자열이 될 것입니다.아래 댓글을 참고하세요.우리는 파워셸이 끈이 그렇게 되어야 한다고 주장하는 결론을 내려야 합니다.:NullString(다른 경우에는 유용함) 문서에서 null을 a에 전달할 때만 도움이 될 것을 약속합니다.NET method".
매개변수를 구분하기 위해 ""를 놓친 것 같습니다.
Param (
[string]$ObjectName,
[int]$ObjectId,
[wmi]$Object
)
언급URL : https://stackoverflow.com/questions/25459799/passing-null-to-a-mandatory-parameter-to-a-function
'programing' 카테고리의 다른 글
| 아이폰 시뮬레이터 리셋 방법 (0) | 2023.10.13 |
|---|---|
| 스레드에 바인딩된 최대 절전 모드 세션이 없으며 구성에서는 여기서 트랜잭션이 아닌 세션을 생성할 수 없습니다. (0) | 2023.10.08 |
| fstream의 peek에 해당하는 C (0) | 2023.10.08 |
| jQuery에서 사용하는 방법 :not and hasClass()에서 클래스 없이 특정 요소를 가져오는 방법 (0) | 2023.10.08 |
| 속성에 따라 개체 배열을 별도의 배열로 분할 (0) | 2023.10.08 |