Comment tester pour $null tableau en PowerShell
Je suis en utilisant une variable de tableau dans PowerShell 2.0. Si elle n'a pas de valeur, il sera de$, null, je peux tester avec succès:
PS C:\> [array]$foo = $null
PS C:\> $foo -eq $null
True
Mais quand je lui donne une valeur, le test pour $null ne retourne rien:
PS C:\> [array]$foo = @("bar")
PS C:\> $foo -eq $null
PS C:\>
Comment "-eq $null" donnent pas de résultats? C'est soit $null ou pas.
Quelle est la bonne façon de déterminer si un tableau est rempli vs $null?
Vous devez vous connecter pour publier un commentaire.
Son un tableau, de sorte que vous êtes à la recherche pour le compte de test pour le contenu.
Je le recommande
Le "pourquoi" de ce qui est lié à la façon dont PSH poignées de comparaison des objets de collection
[array]$foo = $null
. Au lieu de 0,$foo.count
ne retourne rien.else
bloc deif ($foo -eq $null)
déclaration. Intéressant de constater que lorsque[array]$foo = $null
,$foo.count -eq 0
est Faux, mais$foo.count -lt 0
est Vrai. Je suppose que $null est inférieur à 0. Me demande si c'est documenté quelque part?$null.count -lt 0
est Vrai, tandis que$null.count -gt 0
est Faux. Si c'est la garantie de résultat, puis$foo.count -lt 0
pourrait être utilisé pour vérifier les $null, e.g quand je veux faire quelque chose si le tableau n'a pas été créé. Bien que dans ce cas, leif ($foo -eq $null
) peut être plus lisible.Vous pouvez modifier l'ordre des opérandes:
Noter que
-eq
dans PowerShell n'est pas une relation d'équivalence.help about_Comparison_Operators
où cela est décrit.affiche l'aide et comprend ce texte:
[array]$foo=@("")
, si votre déclaration de travaux, mais l'inverse n'est pas:if($foo -ne $null) { "no" } else { "yes" }
retourne "oui". Puisque la principale chose que je veux faire, c'est de tester pour ne PAS null (c'est à dire il y a des éléments à travailler sur), cela signifie que je dois utiliserif($foo -eq $null) { # Do nothing } else { #Do something }
.$a = @(); $a -eq $null
Si votre solution exige le retour de 0 au lieu de vrai/faux, j'ai trouvé ceci pour être utile:
Cette opération est différente de la propriété count de la matrice, parce que
Measure-Object
est de compter les objets. Puisqu'il n'existe pas, il sera de retour 0.Comment vous voulez que les choses se comporter?
Si vous voulez des tableaux avec des éléments à être traités de la même comme non affecté tableaux, utilisation:
Si vous voulez un tableau vide pour être considéré comme ayant une valeur (même vide), utilisation:
Si vous voulez un tableau qui est rempli avec uniquement des valeurs nulles pour être considérée comme nulle:
NB: Dans l'au-dessus-je utiliser
$_.PSObject
sur$_
pour éviter[bool]$false
,[int]0
,[string]''
, etc filtrage; car ici nous sommes concentrés uniquement sur les valeurs null.Les autres réponses de l'adresse principale de la poussée de la question, mais juste pour faire un commentaire sur cette partie...
C'est déroutant au premier abord, mais qui est de vous donner le résultat de
$foo -eq $null
, c'est juste que le résultat n'a pas affichables représentation.Depuis
$foo
est titulaire d'un tableau,$foo -eq $null
signifie "retourner un tableau contenant les éléments de$foo
qui sont égales à$null
". Existe-il des éléments de$foo
qui sont égales à$null
? Non, donc$foo -eq $null
doit retourner un tableau vide. C'est exactement ce qu'il fait, le problème est que quand un tableau vide est affichée sur la console à vous de voir...rien...Le tableau est toujours là, même si vous ne pouvez pas voir l'un de ses éléments...
Nous pouvons utiliser des commandes similaires à confirmer que
$foo -eq $null
est renvoyant un tableau que nous ne sommes pas en mesure de "voir"...Remarque que je suis l'appel de la
Array.GetValue
méthode au lieu de l'utilisation de l'indexeur (c'est à dire($foo -eq $null)[0]
) parce que celle-ci retourne$null
pour invalides indices et il n'y a aucun moyen de les distinguer à partir d'un index valide qui arrive à contenir$null
.Nous voyons un comportement similaire si nous les testons pour
$null
dans/contre un tableau qui contient$null
éléments...Dans ce cas,
$bar -eq $null
retourne un tableau contenant un élément,$null
, qui n'a pas de représentation visuelle à la console...