PowerShell에서 문자열이 null인지 또는 비어 있는지 어떻게 확인할 수 있습니까?


413

IsNullOrEmptyPowerShell에서 문자열이 null인지 또는 비어 있는지 확인하기 위해 기본 제공 기능이 있습니까?

나는 지금까지 그것을 찾을 수 없었고 내장 된 방법이 있다면 이것을 위해 함수를 작성하고 싶지 않습니다.



8
.NET을 사용하고 있으므로 전화를 걸 수 String.IsNullOrEmpty없습니까?
Jon Skeet

답변:


471

IsNullOrEmpty정적 메소드를 사용할 수 있습니다 .

[string]::IsNullOrEmpty(...)

3
Powerhsell의 지식에 관계없이 Powershell 이외의 프로그래머에게는 의미가있는 것이 분명하기 때문에이 방법을 더 좋아합니다.
pencilCake

18
난 그냥 당신이 할 수있는 것 같아 $ var
Shay Levy

4
PowerShell에서 알아야 할 사항 중 하나는 커맨드 렛 또는 함수에 전달 된 null 문자열이 null로 유지되지 않는다는 것입니다. 빈 문자열로 변환됩니다. connect.microsoft.com/PowerShell/feedback/details/861093/… 에서 Microsoft Connect 버그를 참조하십시오 .
JamieSee

25
빈 공간도 확인하려면 [String] :: IsNullOrWhiteSpace (...)를 고려하십시오.
사이

3
@ShayLevy 조심하십시오 !. 이는 최신 버전의 PowerShell에서만 작동합니다. !-not
Kolob Canyon

598

너희들은 이것을 너무 어렵게 만들고있다. PowerShell은이를 매우 우아하게 처리합니다.

> $str1 = $null
> if ($str1) { 'not empty' } else { 'empty' }
empty

> $str2 = ''
> if ($str2) { 'not empty' } else { 'empty' }
empty

> $str3 = ' '
> if ($str3) { 'not empty' } else { 'empty' }
not empty

> $str4 = 'asdf'
> if ($str4) { 'not empty' } else { 'empty' }
not empty

> if ($str1 -and $str2) { 'neither empty' } else { 'one or both empty' }
one or both empty

> if ($str3 -and $str4) { 'neither empty' } else { 'one or both empty' }
neither empty

30
@ pencilCake 예, 제가 말하고있는 것과 위의 예가 실제로 작동한다는 것을 보여줍니다. 테스트에서 확인하지 않는 것은 IsNullOrWhitespace ()입니다.
Keith Hill

3
스크립팅 관점에서이 솔루션에 더 잘 동의합니다. 언제나처럼 Keith Hill은 올바른 해결책을 가지고 있습니다! 감사.
Vippy

2
우아하다고 말하지만 어떤 이유로 JS와 같은 느낌이 듭니다.
Dan Atkinson

2
@VertigoRay 위의 첫 번째 의견을 참조하십시오 IsNullOrWhitespace(). 그러나 PowerShell을 사용한 11 년의 스크립팅 후에는 해당 문자열 테스트 가 거의 필요하지 않다는 것을 알게되었습니다 . :-)
Keith Hill

3
"KeithHill. 당신의 의도가 명확하지 않기 때문에 여전히 안전하지 않습니다. 죄송합니다. [string] :: IsNullOrEmpty를 사용할 때, 당신은 절대적으로 분명합니다. IMO, Powershell은 가장 이상한 창조물입니다. 필수 사항 누락 -isNullOrEmpty 술어는 그 중 하나입니다.
dmitry

40

뿐만 아니라 [string]::IsNullOrEmpty위해 널 (null)를 확인하거나 명시 적 또는 부울 표현식에서 부울 문자열을 캐스팅 할 수 비우합니다 :

$string = $null
[bool]$string
if (!$string) { "string is null or empty" }

$string = ''
[bool]$string
if (!$string) { "string is null or empty" }

$string = 'something'
[bool]$string
if ($string) { "string is not null or empty" }

산출:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

4
좋은 지적이야 If절은 내부적으로 괄호 안의 모든 것을 단일 부울로 변환 합니다. 즉 if($string){Things to do for non-empty-nor-null}, if(!$string){Things to do for empty-or-null}명시 적 변환 [bool]이 있거나 없거나 충분합니다.
Ch.Idea

20

함수의 매개 변수 인 경우 ValidateNotNullOrEmpty다음 예에서 볼 수 있듯이 이를 검증 할 수 있습니다.

Function Test-Something
{
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$UserName
    )

    #stuff todo
}

10

개인적으로 공백 ($ STR3)을 '비어 있지 않음'으로 허용하지 않습니다.

공백 만 포함 된 변수가 매개 변수로 전달 될 때 매개 변수 값이 공백이 아니라고 '$ null'이 아니라는 오류가 발생하는 경우가 있습니다. 일부 제거 명령은 루트 대신 폴더를 제거 할 수 있습니다. 하위 폴더 이름이 "공백"인 경우 많은 경우 공백이 포함 된 문자열을 허용하지 않는 모든 이유가 있습니다.

이것이 최선의 방법이라고 생각합니다.

$STR1 = $null
IF ([string]::IsNullOrWhitespace($STR1)){'empty'} else {'not empty'}

$STR2 = ""
IF ([string]::IsNullOrWhitespace($STR2)){'empty'} else {'not empty'}

$STR3 = " "
IF ([string]::IsNullOrWhitespace($STR3)){'empty !! :-)'} else {'not Empty :-('}

빈!! :-)

$STR4 = "Nico"
IF ([string]::IsNullOrWhitespace($STR4)){'empty'} else {'not empty'}

비어 있지 않음


5

컴퓨터에서 [String] :: IsNullOrWhiteSpace ()가없는 컴퓨터에서 실행해야하는 PowerShell 스크립트가 있으므로 직접 작성했습니다.

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}

5
# cases
$x = null
$x = ''
$x = ' '

# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}

3

대한 PowerShell을 2.0 교체 [string]::IsNullOrWhiteSpace()ISstring -notmatch "\S"

( " \ S "= 공백이 아닌 문자)

> $null  -notmatch "\S"
True
> "   "  -notmatch "\S"
True
> " x "  -notmatch "\S"
False

성능은 매우 가깝습니다.

> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace("   ")}}
TotalMilliseconds : 3641.2089

> Measure-Command {1..1000000 |% {"   " -notmatch "\S"}}
TotalMilliseconds : 4040.8453

1

순수한 PowerShell 방식으로이 작업을 수행하는 또 다른 방법은 다음과 같은 작업을 수행하는 것입니다.

("" -eq ("{0}" -f $val).Trim())

null, 빈 문자열 및 공백이 성공적으로 평가됩니다. 전달 된 값을 빈 문자열로 서식을 지정하여 null을 처리합니다 (그렇지 않으면 Trim이 호출 될 때 null이 오류를 발생시킵니다). 그런 다음 빈 문자열로 평등을 평가하십시오. 나는 여전히 IsNullOrWhiteSpace를 선호한다고 생각하지만 다른 방법을 찾고 있다면 이것이 효과가 있습니다.

$val = null    
("" -eq ("{0}" -f $val).Trim())
>True
$val = "      "
("" -eq ("{0}" -f $val).Trim())
>True
$val = ""
("" -eq ("{0}" -f $val).Trim())
>True
$val = "not null or empty or whitespace"
("" -eq ("{0}" -f $val).Trim())
>False

지루함을 느끼기 위해이 부분을 가지고 더 짧게 만들었습니다 (더 비밀 스럽지만).

!!(("$val").Trim())

또는

!(("$val").Trim())

당신이하려는 일에 따라.


1

있습니다 "if ($str)""IsNullOrEmpty"테스트가 모든 경우에 상대적으로 작동하지 않습니다는 :의 할당은 $str=0모두 거짓 생산, 의도 프로그램의 의미에 따라,이 놀라운를 얻을 수 있습니다.


$ str = 0은 좋은 코딩 방법이 아닙니다. $ str = '0'은 IsNullOrEmpty의 예상 결과가 무엇인지 의심 할 여지가 없습니다.
dmitry

-1

길이를 확인하십시오. 객체가 존재하면 길이를 갖습니다.

널 오브젝트는 길이가없고 존재하지 않으며 점검 할 수 없습니다.

문자열 객체는 길이가 있습니다.

문제는 IsNull 또는 IsEmpty, NOT IsNull 또는 IsEmpty 또는 IsWhiteSpace입니다.

#Null
$str1 = $null
$str1.length
($str1 | get-member).TypeName[0]
# Returns big red error

#Empty
$str2 = ""
$str2.length
($str2 | get-member).TypeName[0]
# Returns 0

## Whitespace
$str3 = " "
$str3.length
($str3 | get-member).TypeName[0]
## Returns 1 

2
다시 Null objects have no length실행 해 보셨습니까 $null.length? :-) 빠른 부울 테스트의 경우 Get-Member에 파이프를 연결 한 다음 $ null 케이스의 결과 오류를 처리해야합니다.
Keith Hill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.