함수에 필수 매개 변수에 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] $null
0다가 .이 하려면 몇 .다.
- 매개 변수 유형 제약 조건을 제거합니다.코드에서 $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()]
'다를 을 알려드립니다.$null
int, 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
.$null
n에 된다는 ''
다시 하겠지만, 시,이지만,은 참".$null
중인
nullable 과(와) 같은 :[wmi]
(a는).을 사용할 수 class) 는 null 로 null 로합니다가 하므로 더 .[AllowNull()]
.
만드는 것에 대해서는.[string]
정말로 무효가 될 수 없습니다. 아직도 저를 피하려고 합니다.
[System.Nullable[string]]
오류를 반환합니다.y가system.string
PowerShell에서는 그렇게 보지 않는 것 같지만, 이미 무효입니다.
편집
나는 방금 그것을 알아차렸습니다.
[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 |