Viele gute Antworten hier; ich möchte eine anbieten pragmatische Zusammenfassung con PowerShell-idiomatische Lösungen :
Gegeben eine Variable $str
die enthalten können $null
o un string (oder jede skalar ):
# Test for $null or '' (empty string).
# Equivalent of: [string]::IsNullOrEmpty($str)
$str -like ''
# Test for $null or '' or all-whitespace.
# Equivalent of: [string]::IsNullOrWhitespace($str)
$str -notmatch '\S'
-
Die Verwendung der reinen Zeichenkette -like
Operator zwingt das LHS implizit zu einer string und da [string] $null
die leere Zeichenkette ergibt, sind beide '' -like ''
y $null -like ''
Ertrag $true
.
-
Ähnlich verhält es sich mit der regex -basiert -match
/ -notmatch
Betreiber, wie nur String Operatoren, die ihren LHS-Operanden in eine Zeichenkette umwandeln, und $null
wird behandelt wie ''
bei dieser Umwandlung.
-
\S
ist eine Regex-Escape-Sequenz, die auf jede nicht -Whitespace-Zeichen (es ist die negierte Form von \s
).
-
-match
/ -notmatch
durchführen Teilstring standardmäßig übereinstimmen (und immer nur un übereinstimmen), wenn also \S
übereinstimmt, bedeutet dies, dass mindestens ein Zeichen, das kein Leerzeichen ist, vorhanden ist.
Caveat :
Aufgrund der dynamischen Typisierung von PowerShell kennen Sie den Typ des in einer bestimmten Variablen gespeicherten Werts möglicherweise nicht im Voraus.
Die oben genannten Techniken funktionieren zwar vorhersehbar mit $null
, [string]
Instanzen, und andere Typen, die nicht abzählbar , aufzählbar Werte (andere als Strings) können überraschende Ergebnisse liefern , denn wenn die LHS von -like
y -notmatch
Aufzählungen sind (grob gesagt: Sammlungen), wird die Operation angewendet auf jedes Element und statt einen einzelnen booleschen Wert zurückzugeben, wird die Unterarray mit übereinstimmenden Elementen zurückgegeben wird.
Im Zusammenhang mit einer Bedingung ist die Art und Weise, wie ein Array in einen Booleschen Wert umgewandelt wird, etwas kontraintuitiv; wenn das Array nur un Element, wird dieses Element selbst zu einem Booleschen Wert gezwungen; mit zwei oder mehr Elemente, wird das Array immer auf $true
unabhängig von den Elementwerten - siehe den unteren Abschnitt von diese Antwort . Zum Beispiel:
# -> 'why?', because @('', '') -like '' yields @('', ''), which
# - due to being a 2-element array - is $true
$var = @('', '')
if ($var -like '') { 'why?' }
wenn Sie einen nicht-string enumerable LHS in [string]
wird es von PowerShell durch Verkettung der (verketteten) Elemente mit Leerzeichen in eine Zeichenfolge gebracht. Dies ist auch der Fall implizit wenn Sie anrufen [string]::IsNullOrEmpty()
o [string]::IsNullOrWhiteSpace()
denn ihr Parameter ist [string]
-typisiert.
Daher ist die Typ-agnostische Äquivalente der oben genannten - unter Anwendung der beschriebenen Stringifizierungsregeln - sind:
# Test for $null or '' (empty string) or any stringified value being ''
# Equivalent of: [string]::IsNullOrEmpty($var)
[string] $var -like ''
# Test for $null or '' or all-whitespace or any stringified value being ''
# Equivalent of: [string]::IsNullOrWhitespace($var)
[string] $var -notmatch '\S'