J'ai récemment écrit cette réponse et suis tombé sur quelque chose d'intéressant.
get-aduser -filter {-not (description -eq "auto")} | measure-object
et
get-aduser -filter {description -ne "auto"} | measure-object
retourner deux choses très différentes lorsqu'il est exécuté sur les mêmes données, la première commande renvoyant la valeur attendue. Il apparaît à première vue que les utilisateurs avec une valeur nulle dans le champ de description ne sont pas retournés en tant que correspondances dans la deuxième commande, même si NULL n'est clairement pas égal à "auto".
Quelques personnes dans le chat ont regardé cela et ont vérifié que je ne suis pas fou. Que se passe t-il ici?
powershell
MDMarra
la source
la source
-ne
opérateur de comparaison uniquement dans le-Filter
bloc. Plus précisément, lorsque la valeur d'entrée de la comparaison est$null
.-notlike
origine, mais-ne
je suis passé à après avoir réalisé que je n'obtenais pas ce que je voulais. TBH, j'ai oublié que j'avais même essayé jusqu'à ce que vous en parliez - mais je peux aussi le reproduire.-eq
/ de PoSH-ne
essaie de se comporter comme un SQL=
/<>
? En SQL,foo = NULL
etfoo <> NULL
retournera toujours false, car NULL est «incomparable» - seuls les opérateurs spéciauxfoo IS NULL
etfoo IS NOT NULL
fonctionneront. Le comportement doit être similaire dans PoSH, où votre-not (foo -eq "bar")
filtre retournerait tout ce qui(foo -eq "bar")
est retourné$false
, ce quifoo -eq $null
ferait l'affaire. Au lieu de cela, qu'en est-ilif (!foo -or foo -ne "bar")
(équivalent SQLfoo IS NULL OR foo <> 'bar'
)?Réponses:
La principale différence entre les deux est que la première commande n'implique pas une comparaison directe des valeurs pour obtenir tous les résultats, et la deuxième commande le fait. La première commande inclut les résultats NULL et la seconde non (comme MDMarra l'a déjà découvert). Les deux commandes commencent par cette applet de commande:
Lorsque vous parcourez les étapes ci-dessous, n'oubliez pas que les résultats de cette applet de commande incluent tous les utilisateurs AD indépendamment de toute autre chose dans le
-filter
paramètre suivant.Maintenant, décomposons les deux parties qui sont différentes. Le premier:
...veux dire
-eq
opérateur puisse la comparer à" auto ". Les valeurs NULL sont supprimées de cette comparaison car il ne peut pas comparer un NULL à une valeur de chaîne.-eq
le paramètre de filtre me donne TOUT ce qui N'EST PAS le résultat de(description -eq "auto")
, qui inclura des NULLs, car l'applet de commande d'origine,,get-aduser
inclut tous les utilisateurs AD. Il n'a pas eu à comparer quoi que ce soit à l'-not
opérateur avec l' opérateur. Il vous a juste donné tout en plus des résultats du(description -eq "auto")
filtre.Dans votre exemple, supposons que vous ayez 1 utilisateur AD dont la description est égale à "auto", quelques centaines avec autre chose que "auto" et quelques centaines avec des descriptions NULL. En parcourant la logique de commande, il fera:
Comme il n'a pas eu à comparer quoi que ce soit à quoi que ce soit d'autre à l'aide de l'
-not
opérateur, le résultat inclut les utilisateurs de description NULL qui ont été capturés dans l'get-aduser
applet de commande d' origine .La deuxième commande:
...veux dire
-ne
opérateur puisse la comparer à" auto ". Valeurs NULL sont supprimés de cette comparaison car il ne peut pas comparer un NULL à une valeur de chaîne.Dans votre exemple, supposons à nouveau que vous avez 1 utilisateur AD dont la description est égale à "auto", quelques centaines avec autre chose que "auto" et quelques centaines avec des descriptions NULL. En parcourant la logique de commande, il fera:
Quoi qu'il en soit, toute la différence entre les deux commandes n'est certainement pas intuitive.
En utilisant cette commande, vous devriez également pouvoir attraper les NULLs avec un "-and" comme ceci:
Je ne suis pas à 100% sur la syntaxe car je ne peux pas le tester pour le moment, et il y a probablement une meilleure façon de le faire que cela aussi. Quand tout est en panne, c'est assez anti-climatique et il a fallu beaucoup de frappe pour l'expliquer, mais j'ai rencontré des trucs bizarres comme celui-ci avant d'utiliser les différents opérateurs et beaucoup d'essais et d'erreurs car je ne me souviens jamais de toutes les mises en garde qui vont de pair avec l'utilisation de chacun.
Référence: http://technet.microsoft.com/en-us/library/hh847732.aspx :
la source
Ajout à cette vieille question telle qu'elle apparaît lors de la recherche:
L'utilisation de -Filter avec une correspondance négative telle que -ne ou -notlike exclut les résultats avec des valeurs nulles vides. Pour qu'ils soient inclus, vous devez également faire correspondre explicitement en utilisant -notlike '*' as -eq '' et -eq $ NULL ne sont pas des filtres valides. Notez qu'il s'agit d'une bizarrerie avec -Filter, en utilisant un direct -LdapFilter DOES négatif correspond aux valeurs vides.
Voici un exemple de correspondance multiple avec filtre et LdapFilter avec négatif:
la source