Comment puis-je vérifier si une chaîne est nulle ou vide dans PowerShell?

413

Existe-t-il une IsNullOrEmptyfonction similaire à celle-ci afin de vérifier si une chaîne est nulle ou vide, dans PowerShell?

Je n'ai pas pu le trouver jusqu'à présent et s'il y a un moyen intégré, je ne veux pas écrire de fonction pour cela.

crayonGâteau
la source
2
espérons que
gofor.net
8
Eh bien, vous utilisez .NET, vous ne pouvez donc pas appeler String.IsNullOrEmpty?
Jon Skeet

Réponses:

471

Vous pouvez utiliser la IsNullOrEmptyméthode statique:

[string]::IsNullOrEmpty(...)
Shay Levy
la source
3
J'apprécie davantage cette méthode, car il est évident de ce qu'elle fait, quelles que soient vos connaissances Powerhsell, ce qui aurait du sens pour les programmeurs non Powershell.
crayonCake
18
Je suppose que vous pouvez le faire! $ Var
Shay Levy
4
Une chose à savoir avec PowerShell est que les chaînes nulles passées à une commande ou une fonction ne restent pas nulles. Ils sont convertis en chaînes vides. Voir le bogue Microsoft Connect à connect.microsoft.com/PowerShell/feedback/details/861093/… .
JamieSee
25
Considérez [String] :: IsNullOrWhiteSpace (...) pour valider également les espaces vides.
Sai
3
@ShayLevy Attention au !. Cela ne fonctionne que dans les versions plus récentes de PowerShell. !est un alias pour-not
Kolob Canyon
598

Vous rendez les choses trop difficiles. PowerShell gère cela de manière assez élégante, par exemple:

> $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
Keith Hill
la source
30
@pencilCake Oui, c'est ce que je dis et l'exemple ci-dessus le montre en action. Ce que le test ne vérifiera pas, c'est IsNullOrWhitespace ().
Keith Hill
3
Je suis mieux d'accord avec cette solution du point de vue des scripts. Comme toujours, Keith Hill a la bonne solution! Merci.
Vippy
2
Vous dites élégant, mais pour une raison quelconque, cela ressemble à JS.
Dan Atkinson
2
@VertigoRay Voir mon premier commentaire ci-dessus où je recommande d'utiliser IsNullOrWhitespace()pour ce scénario. Mais après 11 ans de script avec PowerShell, je trouve que j'ai rarement besoin de ce test de chaîne . :-)
Keith Hill
3
"KeithHill. Désolé, ce n'est toujours pas sûr, car votre intention n'est pas claire. Lorsque vous utilisez [string] :: IsNullOrEmpty, vous êtes absolument clair. IMO, Powershell est une création la plus étrange - la plupart du temps, elle est surabondamment riche, mais toujours - le prédicat isNullOrEmpty en fait partie ...
dmitry
40

De plus [string]::IsNullOrEmpty, pour vérifier la valeur null ou vide, vous pouvez convertir une chaîne en un booléen explicitement ou dans des expressions booléennes:

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

Production:

False
string is null or empty

False
string is null or empty

True
string is not null or empty
Roman Kuzmin
la source
4
Joli point. IfLa clause convertit en interne tout ce qui se trouve entre parenthèses en un seul booléen, ce qui signifie if($string){Things to do for non-empty-nor-null}ou if(!$string){Things to do for empty-or-null}sans conversion explicite [bool]serait suffisant.
Ch.Idea
20

S'il s'agit d'un paramètre dans une fonction, vous pouvez le valider avec ValidateNotNullOrEmptycomme vous pouvez le voir dans cet exemple:

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

    #stuff todo
}
Rubanov
la source
10

Personnellement, je n'accepte pas un espace ($ STR3) comme étant «non vide».

Lorsqu'une variable qui ne contient que des espaces blancs est transmise à un paramètre, il est souvent erroné que la valeur des paramètres ne soit pas '$ null', au lieu de dire que ce n'est peut-être pas un espace, certaines commandes de suppression peuvent supprimer un dossier racine au lieu d'un sous-dossier si le nom du sous-dossier est un "espace blanc", toutes raisons pour ne pas accepter une chaîne contenant des espaces blancs dans de nombreux cas.

Je trouve que c'est la meilleure façon d'y parvenir:

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

Vide

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

Vide

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

Vide!! :-)

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

Pas vide

Nico van der Stok
la source
5

J'ai un script PowerShell que je dois exécuter sur un ordinateur tellement obsolète qu'il n'a pas [String] :: IsNullOrWhiteSpace (), j'ai donc écrit le mien.

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}
mhenry1384
la source
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'}
Skatterbrainz
la source
3

Remplacement PowerShell 2.0 pour [string]::IsNullOrWhiteSpace()est -string -notmatch "\S"

(" \ S " = tout caractère non blanc)

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

La performance est très proche:

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

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

Une autre façon d'accomplir cela d'une manière PowerShell pure serait de faire quelque chose comme ceci:

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

Cela évalue correctement la chaîne vide, vide et les espaces. Je formate la valeur passée dans une chaîne vide pour gérer null (sinon un null provoquera une erreur lorsque le Trim sera appelé). Ensuite, évaluez simplement l'égalité avec une chaîne vide. Je pense que je préfère toujours IsNullOrWhiteSpace, mais si vous cherchez une autre façon de le faire, cela fonctionnera.

$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

Dans un accès d'ennui, j'ai joué avec cela et je l'ai raccourci (quoique plus cryptique):

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

ou

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

en fonction de ce que vous essayez de faire.

Ryan
la source
1

Notez que les tests "if ($str)"et "IsNullOrEmpty"ne fonctionnent pas de manière comparable dans tous les cas: une affectation de $str=0produit false pour les deux, et selon la sémantique du programme prévu, cela pourrait donner une surprise.

Steve Friedl
la source
$ str = 0 n'est pas une bonne pratique de codage. $ str = '0' ne laissera aucun doute sur le résultat attendu de IsNullOrEmpty.
dmitry
-1

Vérifiez la longueur. Si l'objet existe, il aura une longueur.

Les objets nuls n'ont pas de longueur, n'existent pas et ne peuvent pas être vérifiés.

Les objets chaîne ont une longueur.

La question était: IsNull ou IsEmpty, PAS IsNull ou IsEmpty ou 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 
Luke B_
la source
2
RE Null objects have no length- avez-vous essayé d'exécuter $null.length? :-) Pour un test booléen rapide, canaliser dans Get-Member et ensuite gérer l'erreur résultante pour le cas $ null me semble un peu lourd.
Keith Hill