Come posso verificare se una stringa è nulla o vuota in PowerShell?


413

Esiste una funzione integrata IsNullOrEmptysimile per verificare se una stringa è nulla o vuota, in PowerShell?

Non sono riuscito a trovarlo finora e se esiste un modo integrato, non voglio scrivere una funzione per questo.



8
Bene, stai usando .NET, quindi non puoi chiamare String.IsNullOrEmpty?
Jon Skeet il

Risposte:


471

È possibile utilizzare il IsNullOrEmptymetodo statico:

[string]::IsNullOrEmpty(...)

3
Mi piace di più in questo modo poiché è ovvio ciò che fa indipendentemente dalle tue conoscenze su Powerhsell, il che avrebbe senso per i programmatori non Powershell.
pencilCake

18
Immagino che tu possa semplicemente fare! $ Var
Shay Levy,

4
Una cosa da tenere presente con PowerShell è che le stringhe null passate a un commandlet o a una funzione non rimangono null. Vengono convertiti in stringhe vuote. Vedere il bug di Microsoft Connect su connect.microsoft.com/PowerShell/feedback/details/861093/… .
Jamie Vedi l'

25
Considera [String] :: IsNullOrWhiteSpace (...) anche per la convalida di spazi vuoti.
Sai,

3
@ShayLevy Attento con il !. Funziona solo con le versioni più recenti di PowerShell. !è un alias per-not
Kolob Canyon,

598

Ragazzi, lo state rendendo troppo difficile. PowerShell lo gestisce in modo abbastanza elegante, ad esempio:

> $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 Sì, quello che sto dicendo e l'esempio sopra lo mostra in azione. Ciò che il test non verificherà è IsNullOrWhitespace ().
Keith Hill,

3
Concordo meglio con questa soluzione dal punto di vista dello scripting. Come sempre, Keith Hill ha la soluzione corretta! Grazie.
Vippy,

2
Dici elegante, ma per qualche motivo, questo sembra JS.
Dan Atkinson,

2
@VertigoRay Vedi il mio primo commento sopra dove consiglio di utilizzare IsNullOrWhitespace()per quello scenario. Ma dopo 11 anni di scripting con PowerShell, trovo che ho bisogno di quel test di stringa molto raramente . :-)
Keith Hill

3
"KeithHill. Mi dispiace che non sia ancora sicuro, poiché la tua intenzione non è chiara. Quando usi [stringa] :: IsNullOrEmpty, sei assolutamente chiaro. IMO, Powershell è una creazione più strana - il più delle volte è eccessivamente ricca, ma comunque elementi essenziali mancanti. -Il predicato NullOrEmpty è uno di questi ...
dmitry

40

Oltre a [string]::IsNullOrEmptyper verificare la presenza di null o vuoto, è possibile eseguire il cast di una stringa in un booleano in modo esplicito o in espressioni booleane:

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

Produzione:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

4
Bel punto. Ifla clausola converte internamente tutto all'interno della parentesi in singolo booleano, il che significa che if($string){Things to do for non-empty-nor-null}o if(!$string){Things to do for empty-or-null}senza conversione esplicita [bool]sarebbe sufficiente.
Ch.Idea,

20

Se si tratta di un parametro in una funzione, è possibile convalidarlo con ValidateNotNullOrEmptycome si può vedere in questo esempio:

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

    #stuff todo
}

10

Personalmente, non accetto uno spazio bianco ($ STR3) come "non vuoto".

Quando una variabile che contiene solo spazi bianchi viene passata a un parametro, spesso commetterà un errore nel fatto che il valore dei parametri potrebbe non essere '$ null', invece di dire che potrebbe non essere uno spazio bianco, alcuni comandi di rimozione potrebbero rimuovere una cartella radice anziché un sottocartella se il nome della sottocartella è uno "spazio bianco", tutti i motivi per non accettare una stringa contenente spazi bianchi in molti casi.

Trovo che questo sia il modo migliore per realizzarlo:

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

Vuoto

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

Vuoto

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

Vuoto!! :-)

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

Non vuoto


5

Ho uno script di PowerShell che devo eseguire su un computer così obsoleto da non avere [String] :: IsNullOrWhiteSpace (), quindi ho scritto il mio.

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

Sostituzione di PowerShell 2.0 per [string]::IsNullOrWhiteSpace()èstring -notmatch "\S"

(" \ S " = qualsiasi carattere non bianco)

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

Le prestazioni sono molto vicine:

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

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

1

Un altro modo per ottenere questo risultato in modo puro PowerShell sarebbe quello di fare qualcosa del genere:

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

Ciò viene valutato correttamente per null, stringa vuota e spazi bianchi. Sto formattando il valore passato in una stringa vuota per gestire null (altrimenti un null causerà un errore quando viene chiamato Trim). Quindi valuta l'uguaglianza con una stringa vuota. Penso di preferire ancora IsNullOrWhiteSpace, ma se stai cercando un altro modo per farlo, funzionerà.

$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 un impeto di noia, ci ho giocato un po 'e l'ho reso più breve (anche se più criptico):

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

o

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

a seconda di cosa stai cercando di fare.


1

Si noti che i test "if ($str)"e "IsNullOrEmpty"non funzionano in modo comparabile in tutti i casi: un'assegnazione di $str=0produce falso per entrambi e, a seconda della semantica del programma previsto, questo potrebbe produrre una sorpresa.


$ str = 0 non è una buona pratica di codifica. $ str = '0' non lascerà dubbi sul risultato atteso da IsNullOrEmpty.
Dmitry,

-1

Controlla la lunghezza Se l'oggetto esiste, avrà una lunghezza.

Gli oggetti null non hanno lunghezza, non esistono e non possono essere controllati.

L'oggetto stringa ha una lunghezza.

La domanda era: IsNull o IsEmpty, NOT IsNull o IsEmpty o 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- hai provato a eseguire $null.length? :-) Per un rapido bool test, eseguire il piping su Get-Member e quindi gestire l'errore risultante per il caso $ null mi sembra un po 'pesante.
Keith Hill,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.