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.
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.
Le remplacement PowerShell 2.0 de [string]::IsNullOrWhiteSpace()
est chaîne -notmatch "\S"
(\S = tout caractère autre qu'un espace blanc)
> $null -notmatch "\S"
True
> " " -notmatch "\S"
True
> " x " -notmatch "\S"
False
Les performances sont très proches :
> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace(" ")}}
TotalMilliseconds : 3641.2089
> Measure-Command {1..1000000 |% {" " -notmatch "\S"}}
TotalMilliseconds : 4040.8453
Beaucoup de bonnes réponses ici; permettez-moi d'offrir un résumé pragmatique avec des solutions idiomatiques PowerShell :
Étant donné une variable $str
qui peut contenir $null
ou une chaîne de caractères (ou tout scalaire):
# Testez pour $null ou '' (chaîne vide).
# Équivalent de: [string]::IsNullOrEmpty($str)
$str -like ''
# Testez pour $null ou '' ou tous les espaces blancs.
# Équivalent de: [string]::IsNullOrWhitespace($str)
$str -notmatch '\S'
Note : Si $str
peut être une collection (tableau), utilisez les solutions agnostiques du type en bas.
En utilisant l'opérateur de chaîne uniquement -like
, le LHS est implicitement coercé en une chaîne de caractères, et puisque [string] $null
renvoie la chaîne vide, à la fois '' -like ''
et $null -like ''
renvoient $true
.
De même, les opérateurs basés sur les expressions régulières -match
/ -notmatch
, en tant qu'opérateurs uniquement pour les chaînes de caractères, coercissent leur opérande LHS en une chaîne de caractères, et $null
est traité comme ''
dans cette conversion.
\S
est une séquence d'échappement regex qui correspond à n'importe quel caractère non-blanc (c'est la forme négative de \s
).
-match
/ -notmatch
effectuent une correspondance de sous-chaîne par défaut (et ne renvoient jamais qu'une seule correspondance), donc si \S
correspond, l'implication est qu'au moins un caractère qui n'est pas un caractère blanc est présent.
Mise en garde :
Étant donné la typage dynamique de PowerShell, vous pourriez ne pas connaître le type de la valeur stockée dans une variable donnée à l'avance.
Alors que les techniques ci-dessus fonctionnent de manière prévisible avec $null
, les instances de [string]
, et les autres types qui ne sont pas énumérables, des valeurs énumérables (autres que des chaînes) peuvent donner des résultats surprenants_, car si le LHS de -like
et -notmatch
est énumérable (pour simplifier : collections), l'opération est appliquée à chaque élément, et au lieu de renvoyer une seule valeur booléenne, le sous-tableau des éléments correspondants est renvoyé._
_Dans le contexte d'une condition, la manière dont un tableau est coercé en booléen est quelque peu contre-intuitive ; si le tableau a juste un élément, cet élément lui-même est coercé en booléen ; avec deux ou plus d'éléments, le tableau est toujours coercé en $true
, indépendamment des valeurs des éléments - voir la section inférieure de cette réponse. Par exemple :
# -> 'why?', parce que @('', '') -like '' renvoie @('', ''), ce qui
# - à cause d'être un tableau à 2 éléments - est $true
$var = @('', '')
if ($var -like '') { 'why?' }
si vous cochez un LHS énumérable non-chaîne à [string]
, PowerShell le convertit en chaîne en espaçant ses éléments (convertis en chaîne). C'est aussi ce qui se passe de manière implicite lorsque vous appelez [string]::IsNullOrEmpty()
ou [string]::IsNullOrWhiteSpace()
, car leur paramètre est de type [string]
.
Ainsi, les équivalents agnostiques du type de ce qui précède - en utilisant les règles de chaînage décrites - sont :
# Testez pour $null ou '' (chaîne vide) ou toute valeur convertie en chaîne étant ''
# Équivalent de: [string]::IsNullOrEmpty($var)
[string] $var -eq ''
# Testez pour $null ou '' ou tout l'espace blanc ou toute valeur convertie en chaîne étant ''
# Équivalent de: [string]::IsNullOrWhitespace($var)
([string] $var).Trim() -eq ''_
Une autre manière d'accomplir ceci de manière purement PowerShell serait de faire quelque chose comme ceci :
("" -eq ("{0}" -f $val).Trim())
Cela s'évalue avec succès pour null, une chaîne vide et des espaces. Je formate la valeur passée en une chaîne vide pour gérer null (sinon un null provoquera une erreur lors de l'appel de Trim). Ensuite, il suffit d'évaluer l'égalité avec une chaîne vide. Je préfère toujours IsNullOrWhiteSpace, mais si vous cherchez une autre manière de le faire, cela fonctionnera.
$val = null
("" -eq ("{0}" -f $val).Trim())
>Vrai
$val = " "
("" -eq ("{0}" -f $val).Trim())
>Vrai
$val = ""
("" -eq ("{0}" -f $val).Trim())
>Vrai
$val = "not null or empty or whitespace"
("" -eq ("{0}" -f $val).Trim())
>Faux
Dans un moment d'ennui, j'ai joué avec ceci et l'ai raccourci (bien que plus cryptique) :
!!(("$val").Trim())
ou
!(("$val").Trim())
en fonction de ce que vous essayez de faire.
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.
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
?