Esiste una funzione integrata IsNullOrEmpty
simile 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.
String.IsNullOrEmpty
?
Esiste una funzione integrata IsNullOrEmpty
simile 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.
String.IsNullOrEmpty
?
Risposte:
È possibile utilizzare il IsNullOrEmpty
metodo statico:
[string]::IsNullOrEmpty(...)
!
. Funziona solo con le versioni più recenti di PowerShell. !
è un alias per-not
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
IsNullOrWhitespace()
per quello scenario. Ma dopo 11 anni di scripting con PowerShell, trovo che ho bisogno di quel test di stringa molto raramente . :-)
Oltre a [string]::IsNullOrEmpty
per 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
If
la 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.
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
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
}
}
# cases
$x = null
$x = ''
$x = ' '
# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
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
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.
Si noti che i test "if ($str)"
e "IsNullOrEmpty"
non funzionano in modo comparabile in tutti i casi: un'assegnazione di $str=0
produce falso per entrambi e, a seconda della semantica del programma previsto, questo potrebbe produrre una sorpresa.
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
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.