PowerShell'de bir dizenin boş olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


471

IsNullOrEmptyStatik yöntemi kullanabilirsiniz :

[string]::IsNullOrEmpty(...)

3
Powershell olmayan programcılar için mantıklı olan Powerhsell bilginizden bağımsız olarak ne yaptığı açıktır.
pencilCake

18
Sanırım yapabilirsin! $ Var
Shay Levy

4
PowerShell ile dikkat edilmesi gereken bir şey, bir komut dosyasına veya işleve iletilen boş dizelerin boş kalmamasıdır. Boş dizgeye dönüştürülürler. Connect.microsoft.com/PowerShell/feedback/details/861093/… adresindeki Microsoft Connect hatasına bakın .
JamieSee

25
Boş alanları da doğrulamak için [String] :: IsNullOrWhiteSpace (...) öğesini düşünün.
Sai

3
@ShayLevy Dikkatli olun !. Bu yalnızca PowerShell'in daha yeni sürümlerinde çalışır. !için bir takma ad-not
Kolob Canyon

598

Siz bunu çok zorluyorsunuz. PowerShell bunu oldukça zarif bir şekilde ele alır:

> $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 Evet, söylediklerim ve yukarıdaki örnek bunu iş başında gösteriyor. Testin kontrol etmediği şey IsNullOrWhitespace ().
Keith Hill

3
Bu çözüme komut dosyası açısından daha iyi katılıyorum. Her zaman olduğu gibi, Keith Hill'in doğru çözümü var! Teşekkürler.
Vippy

2
Zarif diyorsun, ama nedense bu JS gibi geliyor.
Dan Atkinson

2
@VertigoRay IsNullOrWhitespace()Bu senaryo için kullanmanızı önerdiğim ilk yorumuma bakın . Ancak 11 yıllık PowerShell ile senaryo yazdıktan sonra, nadiren bu dize testine ihtiyacım olduğunu görüyorum . :-)
Keith Hill

3
"KeithHill. Üzgünüm, hala güvensiz, niyetiniz belli değil. [String] :: IsNullOrEmpty kullandığınızda, kesinlikle açıksınız. IMO, Powershell en tuhaf bir yaratımdır - çoğu zaman aşırı zengin, ama yine de eksik şartlar -isNullOrEmpty yüklem onlardan biri ...
dmitry

40

Ek olarak [string]::IsNullOrEmptysırayla boş olup olmadığını kontrol veya açıkça veya Boole ifadelerinde bir Boolean bir dize yayınlayabileceğim boşaltmak için:

$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" }

Çıktı:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

4
Güzel nokta. Iffıkra içten araçlar tek mantıksala parantez içindeki her şeyi dönüştürür if($string){Things to do for non-empty-nor-null}veya if(!$string){Things to do for empty-or-null}açık dönüştürme olmadan [bool]yeterli olacaktır.
Ch.Idea

20

Bir işlevdeki bir parametreyse ValidateNotNullOrEmpty, bu örnekte gördüğünüz gibi ile doğrulayabilirsiniz :

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

    #stuff todo
}

10

Şahsen bir boşluk ($ STR3) 'boş' olarak kabul etmiyorum.

Yalnızca beyaz boşluklar içeren bir değişken bir parametreye iletildiğinde, parametre değerinin boşluk olmadığına dair bir ifade yerine '$ null' olmayabilir, bazı kaldırma komutları alt klasör adı bir "boşluk" ise, tüm nedenler çoğu durumda boşluk içeren bir dizeyi kabul etmemek için kullanılır.

Bunu başarmanın en iyi yolu olduğunu düşünüyorum:

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

Boş

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

Boş

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

Boş!! :-)

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

Boş değil


5

Ben bir bilgisayarda o kadar eski [String] :: IsNullOrWhiteSpace () yok, bu yüzden kendi yazdı çalıştırmak zorunda bir PowerShell komut dosyası var.

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

İçin PowerShell 2.0 yedek [string]::IsNullOrWhiteSpace()DİRstring -notmatch "\S"

(" \ S " = boşluk olmayan herhangi bir karakter)

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

Performans çok yakın:

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

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

1

Bunu saf bir PowerShell tarzında gerçekleştirmenin başka bir yolu da şöyle bir şey yapmak olacaktır:

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

Bu, boş, boş dize ve boşluk için başarıyla değerlendirilir. Boş bir dize geçirilen değeri null (aksi takdirde null Trim çağrıldığında bir hataya neden olacaktır) işlemek için biçimlendiriyorum. O zaman eşitliği boş bir dizeyle değerlendirin. Ben hala IsNullOrWhiteSpace tercih düşünüyorum, ama bunu yapmak için başka bir yol arıyorsanız, bu işe yarayacak.

$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

Sıkıntı içinde, ben bu bazı ile oynadı ve daha kısa (daha şifreli de olsa) yaptı:

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

veya

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

ne yapmaya çalıştığınıza bağlı olarak.


1

"if ($str)"Ve "IsNullOrEmpty"testlerinin tüm durumlarda karşılaştırmalı olarak çalışmadığını unutmayın : $str=0her ikisi için de yanlış üretme ataması ve amaçlanan program semantiğine bağlı olarak, bu bir sürpriz verebilir.


$ str = 0 iyi bir kodlama uygulaması değildir. $ str = '0', IsNullOrEmpty'nin beklenen sonucu konusunda hiç şüphe bırakmayacak.
dmitry

-1

Uzunluğu kontrol edin. Nesne varsa, bir uzunluğu olacaktır.

Boş nesnelerin uzunluğu yoktur, mevcut değildir ve denetlenemez.

Dize nesnesinin uzunluğu vardır.

Soru şuydu: IsNull veya IsEmpty, NOT IsNull veya IsEmpty veya 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
RE Null objects have no length- yürütmeyi denediniz $null.lengthmi? :-) Hızlı bir bool testi için, Get-Member içine boru ve daha sonra $ null durumda ortaya çıkan hatayı ele zorunda bana biraz ağır görünüyor.
Keith Hill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.