Я недавно написал этот ответ и наткнулся на что-то интересное.
get-aduser -filter {-not (description -eq "auto")} | measure-object
а также
get-aduser -filter {description -ne "auto"} | measure-object
возвращает две совершенно разные вещи при запуске с одними и теми же данными, при этом первая команда возвращает ожидаемое значение. На первый взгляд кажется, что пользователи с нулевым значением в поле описания не возвращаются в качестве совпадений во второй команде, даже если NULL явно не равно «auto».
Несколько человек в чате посмотрели на это и убедились, что я не сумасшедший. Что тут происходит?
powershell
MDMarra
источник
источник
-ne
оператора сравнения в с-Filter
единственным блоком. В частности, когда входное значение сравнения составляет$null
.-notlike
первоначально, но переключился на-ne
после того, как я понял, что я не получаю то, что я хотел. TBH, я забыл, что даже пробовал это делать, пока ты не упомянул об этом - но я также могу воспроизвести это.-eq
/-ne
пытается вести себя как SQL=
/<>
? В SQL,foo = NULL
иfoo <> NULL
всегда будет возвращать ложь, потому что NULL является «несравненный» - толькоfoo IS NULL
иfoo IS NOT NULL
специальные операторы будут работать. Поведение должно быть аналогичным в PoSH, где ваш-not (foo -eq "bar")
фильтр будет возвращать все, что(foo -eq "bar")
вернуло$false
, чтоfoo -eq $null
будет делать. Вместо этого, как насчетif (!foo -or foo -ne "bar")
(эквивалентный SQLfoo IS NULL OR foo <> 'bar'
)?Ответы:
Основное различие между ними заключается в том, что первая команда не предполагает прямого сравнения значений, чтобы получить все результаты, а вторая команда это делает. Первая команда содержит результаты NULL, а вторая - нет (как MDMarra уже обнаружила). Обе команды начинаются с этого командлета:
При просмотре ниже помните, что в результаты этого командлета включены все пользователи AD, независимо от того, что указано в
-filter
параметре после него.Теперь давайте разберем две разные части. Первый:
...средства
-eq
оператор мог сравнить ее с" auto ". Значения NULL удаляются из этого сравнение, так как он не может сравнивать NULL со строковым значением.-eq
Параметр фильтра дает мне ВСЕ, что НЕ является результатом(description -eq "auto")
, который будет содержать значения NULL, поскольку исходный командлетget-aduser
включает в себя всех пользователей AD. Не нужно было сравнивать что-либо еще с-not
оператором. Он просто дал вам все, кроме результатов(description -eq "auto")
фильтра.В вашем примере предположим, что у вас есть 1 пользователь AD, чье описание равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с NULL-описаниями. Пошаговая логика команд:
Поскольку с помощью
-not
оператора не нужно было сравнивать что-либо с чем-либо еще , в результате было получено описание пользователей NULL, которое было зафиксировано в исходномget-aduser
командлете.Вторая команда:
...средства
-ne
оператор мог сравнить ее с" auto ". Значения NULL удаляются из этого сравнения, поскольку он не может сравнить NULL со строковым значением.В вашем примере снова предположим, что у вас есть 1 пользователь AD, чье описание равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с NULL-описаниями. Пошаговая логика команд:
В любом случае вся разница между двумя командами определенно не интуитивна.
Используя эту команду, вы также сможете перехватывать значения NULL с "-and", например так:
Я не на 100% по синтаксису, так как не могу проверить его прямо сейчас, и, вероятно, есть лучший способ сделать это, чем это тоже. Когда все это разбито, это довольно анти-климатическое и потребовало много печатания, чтобы объяснить, но я столкнулся с такими странными вещами, как это, прежде чем использовать различные операторы и много проб и ошибок, так как я никогда не могу вспомнить все предостережения которые согласуются с использованием каждого.
Ссылка: http://technet.microsoft.com/en-us/library/hh847732.aspx :
источник
Добавим к этому старому вопросу, который возникает при поиске:
Использование -Filter с отрицательным соответствием, таким как -ne или -notlike, исключает результаты с пустыми нулевыми значениями. Чтобы они были включены, вам также необходимо явно сопоставить, используя -notlike '*', поскольку -eq '' и -eq $ NULL не являются допустимыми фильтрами. Обратите внимание, что это причуда с -Filter, использование прямого -LdapFilter ДЕЛАЕТ отрицательное совпадение с пустыми значениями.
Вот пример фильтра и LdapFilter для множественного совпадения с отрицательным:
источник