programing

함수에 필수 매개 변수에 null 전달

muds 2023. 10. 8. 10:26
반응형

함수에 필수 매개 변수에 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

반응형