programing

PowerShell 문자열 기본 매개 변수 값이 예상대로 작동하지 않음

magicmemo 2023. 9. 8. 21:22
반응형

PowerShell 문자열 기본 매개 변수 값이 예상대로 작동하지 않음

#Requires -Version 2.0

[CmdletBinding()]
Param(
  [Parameter()] [string] $MyParam = $null
)

if($MyParam -eq $null) {
  Write-Host 'works'
} else {
  Write-Host 'does not work'
}

출력 "작동하지 않음" => 문자열이 암시적으로 null에서 빈 문자열로 변환된 것처럼 보입니다. 왜죠? 문자열이 비어 있거나 실제로 $208인지 테스트하는 방법은 무엇입니까?이것은 두 개의 다른 값이어야 합니다!

https://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/ 에서 답을 찾았습니다.

가정:

Param(
  [string] $stringParam = $null
)

그리고 매개 변수가 지정되지 않았습니다(기본값 사용 중).

# will NOT work
if ($null -eq $stringParam)
{
}

# WILL work:
if ($stringParam -eq "" -and $stringParam -eq [String]::Empty)
{
}

또는 특수 null 유형을 지정할 수 있습니다.

Param(
  [string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)

이 경우에$null -eq $stringParam예상대로 작동할 것입니다.

이상해요!

사용해야 할 것입니다.AllowNull허용할 경우 속성$null문자열 매개 변수의 경우:

[CmdletBinding()]
Param (
    [Parameter()] 
    [AllowNull()]
    [string] $MyParam
)

그리고 비교 왼쪽에 $null을 사용해야 합니다.

if ($null -eq $MyParam)

예상할 수 있게 작동하기를

[String]과(와) 많은 동등성 비교:: Empty, [String]을 사용할 수 있습니다.:Is NullOrWhiteSpace 또는 [String]::IsNullOrEmpty 정적 메서드는 다음과 같습니다.

param(
    [string]$parameter = $null
)

# we know this is false
($null -eq $parameter)

[String]::IsNullOrWhiteSpace($parameter)
[String]::IsNullOrEmpty($parameter)
('' -eq $parameter)
("" -eq $parameter)

다음과 같은 결과가 나옵니다.

PS C:\...> .\foo.ps1
False
True
True
True
True

$null 값을 유지하려면 매개 변수의 유형을 선언하지 마십시오.

Param(
    $stringParam
)

(타입을 선언할 때 다른 솔루션은 하나도 적용되지 않았습니다.)

그래서 그것은 기본값으로 보입니다.$null유형 모수의 경우[string]기본값은 어떤 이유에서든 빈 문자열입니다.

옵션1

if ($stringParam) { ... }

옵션2

if ($stringParam -eq "") { ... }

옵션3

if ($stringParam -eq [String]::Empty) { ... }

언급URL : https://stackoverflow.com/questions/22906520/powershell-string-default-parameter-value-does-not-work-as-expected

반응형