IsNullOrEmpty
PowerShell'de bir dizenin boş veya boş olup olmadığını kontrol etmek için yerleşik bir işlev var mı?
Şimdiye kadar bulamadım ve yerleşik bir yol varsa, bunun için bir işlev yazmak istemiyorum.
String.IsNullOrEmpty
mısınız?
IsNullOrEmpty
PowerShell'de bir dizenin boş veya boş olup olmadığını kontrol etmek için yerleşik bir işlev var mı?
Şimdiye kadar bulamadım ve yerleşik bir yol varsa, bunun için bir işlev yazmak istemiyorum.
String.IsNullOrEmpty
mısınız?
Yanıtlar:
IsNullOrEmpty
Statik yöntemi kullanabilirsiniz :
[string]::IsNullOrEmpty(...)
!
. Bu yalnızca PowerShell'in daha yeni sürümlerinde çalışır. !
için bir takma ad-not
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
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 . :-)
Ek olarak [string]::IsNullOrEmpty
sı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
If
fı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.
Ş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
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
}
}
# cases
$x = null
$x = ''
$x = ' '
# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
İç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
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.
"if ($str)"
Ve "IsNullOrEmpty"
testlerinin tüm durumlarda karşılaştırmalı olarak çalışmadığını unutmayın : $str=0
her ikisi için de yanlış üretme ataması ve amaçlanan program semantiğine bağlı olarak, bu bir sürpriz verebilir.
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
Null objects have no length
- yürütmeyi denediniz $null.length
mi? :-) 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.