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 ?

1voto

Santiago Squarzon Points 3956

Une autre alternative consiste à ajouter 2 nouveaux Méthodes de script aux instances de System.String en utilisant Update-TypeData:

Update-TypeData -MemberType ScriptMethod -MemberName IsNullOrEmpty -Value {
    return [string]::IsNullOrEmpty($this)
} -TypeName System.String

Update-TypeData -MemberType ScriptMethod -MemberName IsNullOrWhiteSpace -Value {
    return [string]::IsNullOrWhiteSpace($this)
} -TypeName System.String

'hello'.IsNullOrEmpty()  # => False
''.IsNullOrEmpty()       # => True
' '.IsNullOrEmpty()      # => False
' '.IsNullOrWhiteSpace() # => True

1voto

Alexander Miles Points 2207

En adressant la lacune tangentielle de la réponse de @KeithHill qui ne couvrait pas le cas IsNullOrWhitespace, dans PowerShell 7.1 et plus tard, nous pouvons utiliser l' opérateur de membre conditionnel null pour vérifier gracieusement si une chaîne est nulle ou vide sans avoir besoin de vérifier d'abord que la chaîne n'est pas $null nous-mêmes, tout en évitant l'utilisation de [string]::IsNullOrWhitespace(string).

Remarque : Vous pouvez également le faire avec PowerShell 7.0 si vous activez la fonctionnalité expérimentale PSNullConditionalOperators :

Enable-ExperimentalFeature -Name PSNullConditionalOperators

Pour utiliser l'exemple $str3 de la réponse de Keith (et en faisant semblant que l'opérateur ternaire n'existe pas depuis 7.0 pour plus de clarté) :

$str3 = ' '
if ( ${str3}?.Trim() ) {
  'pas vide ou espace blanc'
} else {
  'vide ou espace blanc'
}
vide ou espace blanc

.Trim() est seulement invoqué si $str3 est une valeur non nulle, sinon $null est retourné à la place.


Une chose à se rappeler est qu'un point d'interrogation ? est valide comme partie d'un nom de variable. C'est pourquoi nous devons d'abord dissocier le nom de la variable avant d'appliquer l'opérateur d'accès conditionnel comme ceci : ${str3}


Puisque j'ai mentionné l'opérateur ternaire plus tôt, et puisque cette réponse tourne déjà autour de PowerShell 7.1 et ultérieur, vous pouvez simplifier le bloc de code ci-dessus en utilisant l'opérateur ternaire, en enlevant presque entièrement l'inutile déclaration si/alors/sinon :

${str3}?.Trim() ? 'pas vide ou espace blanc' : 'vide ou espace blanc'

L' opérateur ternaire est une version simplifiée de l'instruction si/alors/sinon pour des conditions de base. Je ne veux pas embrouiller les pistes avec les nuances autour de cela, mais comprenez-le comme "si le côté gauche du unique point d'interrogation ? est vrai, exécutez ce qui est à droite du ?, sinon exécutez ce qui vient après les deux-points :".

Vous pouvez en lire davantage sur l'opérateur ternaire dans la documentation PowerShell.

0voto

Dave Sexton Points 2844

Vous pourriez créer un filtre qui convertit les chaînes vides en valeurs nulles, puis vous n'auriez plus qu'à vérifier la valeur nulle.

filter nullif {@($_, $null)[$_ -eq '']}

Ensuite, vous devez simplement rediriger votre valeur vers celui-ci

('' | nullif) -eq $null
> Vrai
('x' | nullif) -eq $null
> Faux

Une méthode encore plus facile serait d'utiliser une regex

$null -match '^$'
> Vrai
'' -match '^$'
> Vrai
'x' -match '^$'
> Faux

0voto

Steve Friedl Points 33

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

0 votes

$str=0 n'est pas une bonne pratique de codage. $str='0' ne laisse aucun doute sur le résultat attendu de IsNullOrEmpty.

0voto

Zodman Points 329

Une extension de la réponse de Keith Hill (pour tenir compte des espaces blancs) :

$str = "     "
if ($str -and $version.Trim()) { Write-Host "Pas vide" } else { Write-Host "Vide" }

Ceci renvoie "Vide" pour les valeurs nulles, les chaînes vides et les chaînes avec des espaces blancs, et "Pas vide" pour tout le reste.

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