599 Stimmen

Wie kann ich in PowerShell überprüfen, ob eine Zeichenfolge null oder leer ist?

Gibt es eine eingebaute IsNullOrEmpty -ähnliche Funktion, um zu prüfen, ob eine Zeichenfolge in PowerShell null oder leer ist?

Ich konnte es bisher nicht finden, und wenn es einen eingebauten Weg gibt, möchte ich nicht eine Funktion dafür schreiben.

14voto

PowerShell 2.0-Ersatz für [string]::IsNullOrWhiteSpace() es string -notmatch "\S"

(" \S " = beliebiges Zeichen ohne Leerzeichen)

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

Die Leistung ist sehr ähnlich:

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

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

14voto

mklement0 Punkte 303096

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'

8voto

mhenry1384 Punkte 7322

Ich habe ein PowerShell-Skript, das ich auf einem Computer ausführen muss, der so veraltet ist, dass er nicht über [String]::IsNullOrWhiteSpace() verfügt, also habe ich mein eigenes geschrieben.

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

7voto

Skatterbrainz Punkte 1077
# cases
$x = null
$x = ''
$x = ' '

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

3voto

Bender Punkte 17221

Die Behebung des tangentialen Mangels mit @KeithHill's Antwort die nicht die IsNullOrWhitespace Fall können wir in PowerShell 7.1 und höher die Null-Bedingungs-Operator zu prüfen, ob eine Zeichenkette Null oder ein Leerzeichen ist, ohne zuerst prüfen zu müssen, ob die Zeichenkette nicht $null wir selbst und vermeiden dabei die Verwendung von [string]::IsNullOrWhitespace(string) .

Anmerkung: Sie können dies auch mit PowerShell 7.0 tun, wenn Sie die Option PSNullConditionalOperators experimentelle Funktion:

Enable-ExperimentalFeature -Name PSNullConditionalOperators

Zur Verwendung des $str3 Beispiel aus Keiths Antwort (und so tun, als gäbe es den ternären Operator nicht auch seit 7.0, um die Übersichtlichkeit zu wahren):

$str3 = ' '
if ( ${str3}?.Trim() ) {
  'not empty or whitespace'
} else {
  'empty or whitespace'
}
empty or whitespace

.Trim() wird nur aufgerufen, wenn $str3 ein Nicht-Null-Wert ist, andernfalls $null wird stattdessen zurückgegeben.


Es ist zu beachten, dass ein Fragezeichen ? ist als Teil eines Variablennamens gültig. Aus diesem Grund müssen wir erste den Variablennamen zu disambiguieren, bevor der Operator für bedingten Zugriff wie folgt angewendet wird: ${str3}


Da ich den ternären Operator bereits erwähnt habe, et Da sich diese Antwort bereits auf PowerShell 7.1 und höher bezieht, können Sie den obigen Codeblock vereinfachen, indem Sie den ternären Operator verwenden und den Textbaustein entfernen if/then/else Aussage fast vollständig:

${str3}?.Trim() ? 'not empty or whitespace' : 'empty or whitespace'

En ternärer Operator ist eine vereinfachte if/then/else Anweisung für grundlegende Konditionalitäten. Ich möchte das Wasser hier nicht zu sehr mit Nuancen verwirren, aber lesen Sie es als "wenn die linke Seite des einsam Fragezeichen ? wahr ist, führen Sie aus, was auf der rechten Seite der ? oder das ausführen, was nach dem Doppelpunkt kommt : ".

Weitere Informationen über den ternären Operator finden Sie in der PowerShell-Dokumentation .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X