Kluczowa różnica między nimi polega na tym, że pierwsze polecenie nie wymaga bezpośredniego porównania wartości w celu uzyskania wszystkich wyników, a drugie polecenie tak. Pierwsze polecenie zawiera wyniki NULL, a drugie nie (jak już odkryto MDMarra). Oba polecenia zaczynają się od tego polecenia cmdlet:
get-aduser
Przechodząc poniżej, pamiętaj, że wyniki tego polecenia cmdlet obejmują wszystkich użytkowników AD bez względu na wszystko inne w -filter
parametrze po nim.
Teraz podzielmy dwie części, które są różne. Pierwszy:
{-not (description -eq "auto")}
...znaczy
- „dowiedzieć się, gdzie atrybut opisu równa się ciągowi tekstowemu„ auto ”. Aby to porównanie zadziałało, w polu opisu musi istnieć ciąg znaków, aby
-eq
operator mógł porównać go z„ auto ”. Wartości NULL są z tego usuwane porównanie, ponieważ nie można porównać wartości NULL z wartością ciągu.
- niezależnie od
-eq
parametr filtru daje mi WSZYSTKO, co NIE jest wynikiem (description -eq "auto")
, w tym NULL, ponieważ oryginalne polecenie cmdlet get-aduser
obejmuje wszystkich użytkowników AD. Nie musiał niczego porównywać z -not
operatorem. Po prostu dał ci wszystko oprócz wyników (description -eq "auto")
filtru.
W twoim przykładzie załóżmy, że masz 1 użytkownika AD, którego opis jest równy „auto”, kilkaset z czymś innym niż „auto” i kilkaset z opisami NULL. Przejście przez logikę poleceń spowoduje:
- Daj mi wszystkich użytkowników AD (get-aduser), których opis jest równy „auto” - skutkuje 1 użytkownikiem
- Daj mi wszystkich użytkowników AD, którzy NIE są tym, co mi właśnie dałeś - wynikiem jest kilkaset z czymś innym ORAZ kilkaset, które mają NULL.
Ponieważ nie trzeba było porównywać niczego z niczym innym za pomocą -not
operatora, wynik obejmował użytkowników opisu NULL, którzy zostali przechwyceni w oryginalnym poleceniu get-aduser
cmdlet.
Drugie polecenie:
{description -ne "auto"}
...znaczy
- "dowiedzieć się, gdzie atrybut opisu nie jest równy dokładnemu ciągowi" auto ". Ponownie, aby to porównanie zadziałało, w polu opisu musi istnieć ciąg, aby
-ne
operator mógł go porównać z" auto ". Wartości NULL są usuwane z tego porównania, ponieważ nie można porównać wartości NULL z wartością ciągu.
W twoim przykładzie ponownie załóżmy, że masz 1 użytkownika AD, którego opis jest równy „auto”, kilkaset z czymś innym niż „auto” i kilkaset z opisami NULL. Przejście przez logikę poleceń spowoduje:
- Daj mi wszystkich użytkowników AD, których opis nie jest równy „auto” - powoduje, że kilkuset użytkowników ma w opisie coś innego niż „auto”. Nie przyciąga użytkowników z opisami NULL, ponieważ nie może porównywać wartości NULL z ciągiem tekstowym.
Tak czy inaczej cała różnica między tymi dwoma poleceniami jest zdecydowanie nieintuicyjna.
Za pomocą tego polecenia powinieneś być w stanie złapać NULL-y z „-and” również w ten sposób:
{description -ne "auto" -and description -ne $NULL}
Nie jestem w 100% odpowiedzialny za składnię, ponieważ nie mogę jej teraz przetestować i prawdopodobnie jest na to lepszy sposób. Kiedy wszystko jest zepsute, jest dość anty-klimatyczne i wymagało dużo pisania, aby wyjaśnić, ale natknąłem się na takie dziwne rzeczy przed użyciem różnych operatorów i wielu prób i błędów, ponieważ nigdy nie pamiętam wszystkich zastrzeżeń które pasują do każdego z nich.
Odniesienie: http://technet.microsoft.com/en-us/library/hh847732.aspx :
Operatory porównania
Użyj operatorów porównania (-eq, -ne, -gt, -lt, -le, -ge) do porównania wartości i warunków testowych. Na przykład można porównać dwie wartości ciągów, aby ustalić, czy są one równe.
Operatory porównania obejmują operatory dopasowania (-match, -notmatch), które znajdują wzorce za pomocą wyrażeń regularnych; operator replace (-replace), który używa wyrażeń regularnych do zmiany wartości wejściowych; podobne operatory (-podobne, -podobne), które wyszukują wzorce za pomocą znaków wieloznacznych (*); oraz operatory przechowujące (w, -notin, -contains, -notcontains), które określają, czy wartość testowa pojawia się w zestawie referencyjnym.
Zawierają także operatory bitowe (-bAND, -bOR, -bXOR, -bNOT) do manipulowania wzorcami bitowymi w wartościach.
Aby uzyskać więcej informacji, zobacz about_Comparison_Operators
Operatory logiczne
Użyj operatorów logicznych (-and, -or, -xor, -not,!), Aby połączyć instrukcje warunkowe w jeden złożony warunek warunkowy . Na przykład można użyć operatora logicznego i operatora, aby utworzyć filtr obiektów z dwoma różnymi warunkami.
Aby uzyskać więcej informacji, zobacz about_Logical_Operators.