Ich habe kürzlich diese Antwort geschrieben und bin auf etwas Interessantes gestoßen.
get-aduser -filter {-not (description -eq "auto")} | measure-object
und
get-aduser -filter {description -ne "auto"} | measure-object
Geben Sie zwei sehr unterschiedliche Dinge zurück, wenn Sie mit denselben Daten ausgeführt werden, wobei der erste Befehl den erwarteten Wert zurückgibt. Auf den ersten Blick scheint es, dass Benutzer mit einem Nullwert im Beschreibungsfeld im zweiten Befehl nicht als Übereinstimmungen zurückgegeben werden, obwohl NULL eindeutig nicht gleich "auto" ist.
Ein paar Leute im Chat haben sich das angesehen und bestätigt, dass ich nicht verrückt bin. Was ist hier los?
powershell
MDMarra
quelle
quelle
-ne
Vergleichsoperators innerhalb des-Filter
Blocks zu sein. Insbesondere, wenn der Eingabewert des Vergleichs ist$null
.-notlike
ursprünglich auf diese Verwendung gestoßen , habe aber zu gewechselt,-ne
nachdem mir klar wurde, dass ich nicht das bekam, was ich wollte. TBH, ich habe vergessen, dass ich das sogar versucht habe, bis Sie es erwähnt haben - aber ich kann es auch reproduzieren.-eq
/-ne
-Klausel von PoSH , sich wie ein SQL=
/ zu verhalten<>
? In SQLfoo = NULL
undfoo <> NULL
wird immer false zurückgeben, da NULL 'unvergleichbar' ist - nur diefoo IS NULL
undfoo IS NOT NULL
spezielle Operatoren funktionieren. Das Verhalten muss in PoSH ähnlich sein, wo Ihr-not (foo -eq "bar")
Filter alles(foo -eq "bar")
zurückgeben würde, wofür zurückgegeben wurde$false
, wasfoo -eq $null
tun würde. Wie wäre es stattdessen mitif (!foo -or foo -ne "bar")
(äquivalentem SQLfoo IS NULL OR foo <> 'bar'
)?Antworten:
Der Hauptunterschied zwischen den beiden besteht darin, dass der erste Befehl keinen direkten Vergleich der Werte beinhaltet, um alle Ergebnisse zu erhalten, und der zweite Befehl. Der erste Befehl enthält NULL-Ergebnisse und der zweite nicht (wie MDMarra bereits festgestellt hat). Beide Befehle beginnen mit diesem Cmdlet:
Denken Sie beim Durchgehen des Folgenden daran, dass die Ergebnisse dieses Cmdlets alle AD-Benutzer enthalten, unabhängig davon, ob der
-filter
Parameter danach noch etwas enthält.Lassen Sie uns nun die beiden Teile aufteilen, die unterschiedlich sind. Der erste:
...meint
-eq
Bediener in der Lage sein , es zu vergleichen , um zu‚auto‘. NULL - Werte werden von diesem gelöscht Vergleich, da NULL nicht mit einem Zeichenfolgenwert verglichen werden kann.-eq
Filterparameter geben mir ALLES, was NICHT das Ergebnis von ist(description -eq "auto")
, das NULL-Werte enthält, da das ursprüngliche Cmdletget-aduser
alle AD-Benutzer enthält. Es musste nichts mit etwas anderem mit dem-not
Bediener vergleichen. Es gab Ihnen nur alles außer den Ergebnissen des(description -eq "auto")
Filters.Angenommen, Sie haben in Ihrem Beispiel einen AD-Benutzer, dessen Beschreibung gleich "auto" ist, einige hundert mit etwas anderem als "auto" und einige hundert mit NULL-Beschreibungen. Durchlaufen der Befehlslogik:
Da mit dem
-not
Operator nichts mit anderen verglichen werden musste, enthielt das Ergebnis die NULL-Beschreibungsbenutzer, die im ursprünglichenget-aduser
Cmdlet erfasst wurden.Der zweite Befehl:
...meint
-ne
Bediener sie mit" auto "vergleichen kann. NULL-Werte werden aus diesem Vergleich entfernt, da NULL nicht mit einem Zeichenfolgenwert verglichen werden kann.Nehmen wir in Ihrem Beispiel noch einmal an, Sie haben 1 AD-Benutzer, dessen Beschreibung gleich "auto" ist, einige hundert mit etwas anderem als "auto" und einige hundert mit NULL-Beschreibungen. Durchlaufen der Befehlslogik:
In beiden Fällen ist der gesamte Unterschied zwischen den beiden Befehlen definitiv nicht intuitiv.
Mit diesem Befehl sollten Sie auch in der Lage sein, die NULL-Werte mit einem "-und" wie folgt abzufangen:
Ich bin nicht zu 100% mit der Syntax vertraut, da ich sie momentan nicht testen kann, und es gibt wahrscheinlich auch einen besseren Weg, dies zu tun. Wenn alles kaputt ist, ist es ziemlich antiklimatisch und es hat viel Tipparbeit gekostet, um es zu erklären, aber ich bin auf seltsame Dinge wie dieses gestoßen, bevor ich die verschiedenen Operatoren verwendet habe, und viel Versuch und Irrtum, da ich mich nie an alle Vorbehalte erinnern kann das geht mit der Verwendung jedes einzelnen einher.
Referenz: http://technet.microsoft.com/en-us/library/hh847732.aspx :
quelle
Hinzufügen zu dieser alten Frage, wie sie bei der Suche auftaucht:
Die Verwendung von -Filter mit negativer Übereinstimmung wie -ne oder -notlike schließt Ergebnisse mit leeren Nullwerten aus. Damit sie eingeschlossen werden können, müssen Sie auch explizit mit -notlike '*' übereinstimmen, da -eq '' und -eq $ NULL keine gültigen Filter sind. Beachten Sie, dass dies eine Eigenart bei -Filter ist, bei der ein direkter -LdapFilter verwendet wird.
Hier ist ein Filter- und LdapFilter-Beispiel für eine Mehrfachübereinstimmung mit einem Negativ:
quelle