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


412

Gibt es eine integrierte IsNullOrEmptyähnliche Funktion, um zu überprü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 keine Funktion dafür schreiben.



8
Nun, Sie verwenden .NET, können Sie also nicht anrufen String.IsNullOrEmpty?
Jon Skeet

Antworten:


470

Sie können die IsNullOrEmptystatische Methode verwenden:

[string]::IsNullOrEmpty(...)

3
Ich mag diesen Weg mehr, da es offensichtlich ist, was er unabhängig von Ihrem Powerhsell-Wissen tut - was für Nicht-Powershell-Programmierer sinnvoll wäre.
Bleistiftkuchen

18
Ich denke, Sie können einfach tun! $ Var
Shay Levy

4
Bei PowerShell ist zu beachten, dass an ein Commandlet oder eine Funktion übergebene Nullzeichenfolgen nicht null bleiben. Sie werden in leere Zeichenfolgen umgewandelt. Siehe den Microsoft Connect-Fehler unter connect.microsoft.com/PowerShell/feedback/details/861093/… .
JamieSee

25
Berücksichtigen Sie [String] :: IsNullOrWhiteSpace (...) auch zum Überprüfen von Leerzeichen.
Sai

3
@ShayLevy Vorsicht mit dem !. Dies funktioniert nur in neueren Versionen von PowerShell. !ist ein Alias ​​für-not
Kolob Canyon

598

Ihr macht das zu schwer. PowerShell handhabt dies ziemlich elegant, z.

> $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 Ja, das, was ich sage und das obige Beispiel zeigt es in Aktion. Was der Test nicht überprüft, ist IsNullOrWhitespace ().
Keith Hill

3
Ich stimme dieser Lösung vom Standpunkt der Skripterstellung aus besser zu. Keith Hill hat wie immer die richtige Lösung! Vielen Dank.
Vippy

2
Sie sagen elegant, aber aus irgendeinem Grund fühlt sich das wie JS an.
Dan Atkinson

2
@VertigoRay Siehe meinen ersten Kommentar oben, in dem ich die Verwendung IsNullOrWhitespace()für dieses Szenario empfehle . Aber nach 11 Jahren Scripting mit PowerShell brauche ich diesen Stringtest sehr selten . :-)
Keith Hill

3
"KeithHill. Tut mir leid, das ist immer noch unsicher, da Ihre Absicht nicht klar ist. Wenn Sie [string] :: IsNullOrEmpty verwenden, sind Sie absolut klar. IMO, Powershell ist eine seltsamste Kreation - meistens ist sie übermäßig reich, aber immer noch fehlende wesentliche. -isNullOrEmpty Prädikat ist eines von ihnen ...
dmitry

40

Zusätzlich [string]::IsNullOrEmptykönnen Sie zur Überprüfung auf Null oder Leer eine Zeichenfolge explizit oder in Booleschen Ausdrücken in einen Booleschen Wert umwandeln:

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

Ausgabe:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

3
Schöner Punkt. IfKlausel konvertiert intern alles in der Klammer in einen einzigen Booleschen Wert, was bedeutet, dass if($string){Things to do for non-empty-nor-null}oder if(!$string){Things to do for empty-or-null}ohne explizite Konvertierung [bool]ausreichen würde.
Ch.Idea

20

Wenn es sich um einen Parameter in einer Funktion handelt, können Sie ihn ValidateNotNullOrEmptywie in diesem Beispiel sehen überprüfen:

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

    #stuff todo
}

10

Persönlich akzeptiere ich ein Leerzeichen ($ STR3) nicht als "nicht leer".

Wenn eine Variable, die nur Leerzeichen enthält, an einen Parameter übergeben wird, tritt häufig der Fehler auf, dass der Parameterwert möglicherweise nicht '$ null' ist. Anstatt zu sagen, dass es sich nicht um ein Leerzeichen handelt, entfernen einige Entfernungsbefehle möglicherweise einen Stammordner anstelle von a Unterordner Wenn der Name des Unterordners ein "Leerzeichen" ist, ist dies in vielen Fällen der Grund, eine Zeichenfolge mit Leerzeichen nicht zu akzeptieren.

Ich finde, dies ist der beste Weg, um dies zu erreichen:

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

Leeren

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

Leeren

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

Leeren!! :-)

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

Nicht leer


5

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

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

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

(" \ S " = ein beliebiges Nicht-Leerzeichen)

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

Leistung ist sehr nah:

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

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

1

Eine andere Möglichkeit, dies auf reine PowerShell-Weise zu erreichen, besteht darin, Folgendes zu tun:

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

Dies wird erfolgreich für Null, leere Zeichenfolge und Leerzeichen ausgewertet. Ich formatiere den übergebenen Wert in eine leere Zeichenfolge, um null zu behandeln (andernfalls verursacht eine Null einen Fehler, wenn Trim aufgerufen wird). Bewerten Sie dann einfach die Gleichheit mit einer leeren Zeichenfolge. Ich glaube, ich bevorzuge immer noch den IsNullOrWhiteSpace, aber wenn Sie nach einem anderen Weg suchen, wird dies funktionieren.

$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

In einem Anfall von Langeweile spielte ich damit und machte es kürzer (wenn auch kryptischer):

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

oder

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

je nachdem, was Sie versuchen zu tun.


1

Beachten Sie, dass die Tests "if ($str)"und "IsNullOrEmpty"nicht in allen Fällen vergleichbar funktionieren: Eine Zuweisung von $str=0erzeugt für beide Werte false. Abhängig von der beabsichtigten Programmsemantik kann dies zu einer Überraschung führen.


$ str = 0 ist keine gute Codierungspraxis. $ str = '0' lässt keinen Zweifel daran, was das erwartete Ergebnis von IsNullOrEmpty ist.
dmitry

-1

Überprüfen Sie die Länge. Wenn das Objekt vorhanden ist, hat es eine Länge.

Nullobjekte haben keine Länge, existieren nicht und können nicht überprüft werden.

String-Objekte haben eine Länge.

Die Frage war: IsNull oder IsEmpty, NICHT IsNull oder IsEmpty oder 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- haben Sie versucht, auszuführen $null.length? :-) Für einen schnellen Bool-Test scheint es mir ein bisschen schwer zu sein, in Get-Member zu pipen und dann den resultierenden Fehler für den Fall $ null zu behandeln.
Keith Hill
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.