546 votes

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

Y a-t-il une fonction intégrée similaire à IsNullOrEmpty pour vérifier si une chaîne est nulle ou vide, en PowerShell ?

Je n'ai pas encore trouvé et s'il existe une méthode intégrée, je ne veux pas écrire une fonction pour cela.

2 votes

Espérons que cela aide rkeithhill.wordpress.com/2007/01/06/…

10 votes

Eh bien, vous utilisez .NET, donc ne pouvez-vous pas appeler String.IsNullOrEmpty ?

776voto

Keith Hill Points 73162

Vous rendre la tâche trop difficile. PowerShell gère cela de manière assez élégante par exemple :

> $str1 = $null
> if ($str1) { 'non vide' } else { 'vide' }
vide

> $str2 = ''
> if ($str2) { 'non vide' } else { 'vide' }
vide

> $str3 = ' '
> if ($str3) { 'non vide' } else { 'vide' }
non vide

> $str4 = 'asdf'
> if ($str4) { 'non vide' } else { 'vide' }
non vide

> if ($str1 -et $str2) { 'ni vide' } else { 'un ou les deux sont vides' }
un ou les deux sont vides

> if ($str3 -et $str4) { 'ni vide' } else { 'un ou les deux sont vides' }
ni vide

39 votes

@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().

2 votes

Beaucoup plus propre que [string]::IsNullOrEmpty(...)

0 votes

Je suis d'accord avec votre réponse, mais elle n'est correcte que en combinaison avec @ShayLevy. Lorsqu'il s'agit de chaînes, $null n'est pas la même chose que ''. Pour la plupart des cas d'utilisation, vous pouvez supposer qu'ils le sont ; il s'agit de la discrétion du programmeur. Vous pouvez également considérer ' ' comme vide/null, ce qui peut être fait avec [string]::IsNullOrWhiteSpace(' ') ou ' '.Trim() ... lequel est plus facile à lire ? J'aime la simplicité/l'élégance du codage avec PowerShell, mais parfois vous devez être plus spécifique. Remarque : Utilisez [string]:: + pour "tabuler" à travers tous les méthodes disponibles de [string]

616voto

Shay Levy Points 41404

Vous pouvez utiliser la méthode statique IsNullOrEmpty:

[string]::IsNullOrEmpty(...)

7 votes

J'aime beaucoup cette façon car il est évident de comprendre ce qu'elle fait, peu importe votre connaissance de PowerShell - ce qui serait logique pour les programmeurs non-Powershell.

29 votes

Je suppose que vous pouvez simplement faire !$var

6 votes

Une chose à noter avec PowerShell est que les chaînes nulles passées à un commandlet ou une fonction ne restent pas nulles. Elles sont converties en chaînes vides. Voir le bogue Microsoft Connect sur connect.microsoft.com/PowerShell/feedback/details/861093/….

55voto

Roman Kuzmin Points 13913

En plus de [string]::IsNullOrEmpty pour vérifier la nullité ou la vacuité, vous pouvez convertir une chaîne de caractères en un booléen explicitement ou dans des expressions booléennes :

$string = $null
[bool]$string
if (!$string) { "la chaîne est nulle ou vide" }

$string = ''
[bool]$string
if (!$string) { "la chaîne est nulle ou vide" }

$string = 'quelque chose'
[bool]$string
if ($string) { 'la chaîne n\'est pas nulle ou vide' }

Résultat:

False
la chaîne est nulle ou vide

False
la chaîne est nulle ou vide

True
la chaîne n'est pas nulle ou vide

6 votes

Beau point. Si clause convertit internalement tout ce qui se trouve entre les parenthèses en un seul booléen, ce qui signifie si($string){Choses à faire pour non vide ni null} ou si(!$string){Choses à faire pour vide ou null} sans conversion explicite [bool] serait suffisant.

1 votes

Ces conversions implicites sont la chose la plus dangereuse. Vous devez vous assurer que vous avez exactement le type de chaîne. Considérez $string = @(0) - tout à fait possible de se produire...

27voto

Rubanov Points 1922

Si c'est un paramètre dans une fonction, vous pouvez le valider avec ValidateNotNullOrEmpty comme vous pouvez le voir dans cet exemple :

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

    #travail à faire
}

0 votes

C'est de loin une meilleure approche. Bien que ce ne soit pas exactement une solution à la question posée.

22voto

Nico van der Stok Points 171

Personnellement, je n'accepte pas un espace ($STR3) en tant que 'non vide'.

Lorsqu'une variable contient uniquement des espaces est passée à un paramètre, il arrive souvent qu'une erreur indique que la valeur du paramètre ne peut pas être '$null', au lieu de dire qu'elle ne peut pas être un espace vide, certains commandes de suppression pourraient supprimer un dossier racine au lieu d'un sous-dossier si le nom du sous-dossier est un "espace blanc", autant de raisons de ne pas accepter une chaîne contenant des espaces dans de nombreux cas.

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

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

Vide

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

Vide

$STR3 = " "
IF ([string]::IsNullOrWhitespace($STR3)){'vide !! :-)'} else {'non vide :-('}

Vide!! :-)

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

Non vide

0 votes

.Net dispose de String::IsNullOrEmpty pour votre usage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X