Czy IsNullOrEmpty
w programie PowerShell jest wbudowana funkcja podobna do sprawdzania, czy łańcuch jest pusty lub pusty?
Do tej pory nie mogłem go znaleźć, a jeśli istnieje wbudowany sposób, nie chcę do tego pisać funkcji.
String.IsNullOrEmpty
?
Czy IsNullOrEmpty
w programie PowerShell jest wbudowana funkcja podobna do sprawdzania, czy łańcuch jest pusty lub pusty?
Do tej pory nie mogłem go znaleźć, a jeśli istnieje wbudowany sposób, nie chcę do tego pisać funkcji.
String.IsNullOrEmpty
?
Odpowiedzi:
Możesz użyć IsNullOrEmpty
metody statycznej:
[string]::IsNullOrEmpty(...)
!
. Działa to tylko w nowszych wersjach programu PowerShell. !
jest pseudonimem-not
Robicie to zbyt ciężko. PowerShell obsługuje to dość elegancko, np .:
> $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()
tego scenariusza. Ale po 11 latach pisania skryptów w PowerShell bardzo rzadko potrzebuję tego testu ciągów . :-)
Oprócz tego [string]::IsNullOrEmpty
, aby sprawdzić, czy jest pusta lub pusta, możesz rzutować ciąg znaków na wartość logiczną jawnie lub w wyrażeniach logicznych:
$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" }
Wynik:
False
string is null or empty
False
string is null or empty
True
string is not null or empty
If
klauzula wewnętrznie konwertuje wszystko w nawiasie na pojedynczy logiczny, co oznacza, że wystarczy jawna konwersja if($string){Things to do for non-empty-nor-null}
lub if(!$string){Things to do for empty-or-null}
bez [bool]
niej.
Osobiście nie akceptuję spacji ($ STR3) jako „niepusty”.
Gdy zmienna zawierająca tylko białe znaki jest przekazywana do parametru, często będzie błąd, że wartość parametru nie może być równa „$ null”, zamiast powiedzieć, że nie może to być biała spacja, niektóre polecenia usuwania mogą usunąć folder główny zamiast podfolder, jeśli nazwa podfolderu to „biała spacja”, powodem tego jest to, że w wielu przypadkach nie można zaakceptować ciągu zawierającego białe znaki.
Uważam, że jest to najlepszy sposób na osiągnięcie tego:
$STR1 = $null
IF ([string]::IsNullOrWhitespace($STR1)){'empty'} else {'not empty'}
Pusty
$STR2 = ""
IF ([string]::IsNullOrWhitespace($STR2)){'empty'} else {'not empty'}
Pusty
$STR3 = " "
IF ([string]::IsNullOrWhitespace($STR3)){'empty !! :-)'} else {'not Empty :-('}
Pusty!! :-)
$STR4 = "Nico"
IF ([string]::IsNullOrWhitespace($STR4)){'empty'} else {'not empty'}
Nie pusty
Mam skrypt PowerShell, który muszę uruchamiać na komputerze tak nieaktualnym, że nie ma on [String] :: IsNullOrWhiteSpace (), więc napisałem własny.
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'}
Zamiennik PowerShell 2.0 dla [string]::IsNullOrWhiteSpace()
isstring -notmatch "\S"
(„ \ S ” = dowolny znak inny niż biały)
> $null -notmatch "\S"
True
> " " -notmatch "\S"
True
> " x " -notmatch "\S"
False
Wydajność jest bardzo bliska:
> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace(" ")}}
TotalMilliseconds : 3641.2089
> Measure-Command {1..1000000 |% {" " -notmatch "\S"}}
TotalMilliseconds : 4040.8453
Innym sposobem osiągnięcia tego w czysty sposób PowerShell byłoby zrobienie czegoś takiego:
("" -eq ("{0}" -f $val).Trim())
Sprawdza to z powodzeniem dla pustego, pustego łańcucha i białych znaków. Formatuję przekazaną wartość do pustego ciągu, aby obsługiwał wartość NULL (w przeciwnym razie wartość NULL spowoduje błąd podczas wywoływania Trim). Następnie po prostu oceń równość pustym ciągiem. Myślę, że nadal wolę IsNullOrWhiteSpace, ale jeśli szukasz innego sposobu, to zadziała.
$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
W przypływie nudy trochę się tym bawiłem i skróciłem (choć bardziej tajemniczo):
!!(("$val").Trim())
lub
!(("$val").Trim())
w zależności od tego, co próbujesz zrobić.
Zauważ, że "if ($str)"
i "IsNullOrEmpty"
testy nie działają porównywalnie we wszystkich przypadkach: cesja $str=0
produkuje fałszywe dla obu, i w zależności od zamierzonych semantyki programu, może to wydajność niespodziankę.
Sprawdź długość. Jeśli obiekt istnieje, będzie miał długość.
Obiekty zerowe nie mają długości, nie istnieją i nie można ich sprawdzić.
Obiekt string ma długość.
Pytanie brzmiało: IsNull lub IsEmpty, NOT IsNull lub IsEmpty lub 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
- próbowałeś wykonać $null.length
? :-) Dla szybkiego testu bool, pipowanie do Get-Member, a następnie konieczność obsługi wynikowego błędu w przypadku $ null wydaje mi się nieco ciężki.