我最近写了这个答案并偶然发现了一些有趣的东西。
get-aduser -filter {-not (description -eq "auto")} | measure-object
和
get-aduser -filter {description -ne "auto"} | measure-object
当针对相同数据运行时返回两个截然不同的东西,第一个命令返回预期值。乍一看,在描述字段中具有空值的用户不会在第二个命令中作为匹配项返回,即使 NULL 显然不等于“auto”。
聊天中的几个人已经看过这个并证实我没有疯。这里发生了什么?
两者之间的主要区别在于第一个命令不涉及直接比较值以获得所有结果,而第二个命令涉及。第一个命令包含 NULL 结果,第二个命令不包含(正如 MDMarra 已经发现的那样)。这两个命令都以此 cmdlet 开头:
执行以下操作时,请记住此 cmdlet 的结果包括所有 AD 用户,而不考虑
-filter
其后参数中的任何其他内容。现在让我们分解这两个不同的部分。第一个:
...方法
-eq
操作员能够将其与“auto”进行比较。从中删除 NULL 值比较,因为它不能将 NULL 与字符串值进行比较。-eq
filter 参数给我不是结果的所有内容(description -eq "auto")
,其中将包括 NULL,因为原始 cmdletget-aduser
包括所有 AD 用户。它不必与操作员进行任何比较-not
。(description -eq "auto")
除了过滤器的结果之外,它只为您提供了一切。在您的示例中,假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不是“auto”,还有数百个用户的描述为 NULL。逐步执行它将执行的命令逻辑:
由于它不必使用运算符将任何内容与其他任何内容进行比较,因此结果包括在原始cmdlet
-not
中捕获的 NULL 描述用户。get-aduser
第二个命令:
...方法
-ne
操作员能够将其与“auto”进行比较。NULL 值将从该比较中删除,因为它无法将 NULL 与字符串值进行比较。在您的示例中,再次假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不是“auto”,还有数百个用户的描述为 NULL。逐步执行它将执行的命令逻辑:
无论哪种方式,这两个命令之间的整体差异绝对是不直观的。
使用此命令,您应该能够像这样在其中使用“-and”捕获 NULL:
我不是 100% 了解语法,因为我现在无法对其进行测试,而且可能还有比这更好的方法。当它全部分解时,它是相当反气候的,并且需要大量的打字来解释,但是在使用各种运算符之前我遇到过这样奇怪的东西并且进行了大量的试验和错误,因为我永远无法记住所有的警告伴随着使用每一个。
参考:http ://technet.microsoft.com/en-us/library/hh847732.aspx :
添加到搜索时出现的这个老问题:
将 -Filter 与否定匹配(例如 -ne 或 -notlike)一起使用会排除具有空 null 值的结果。要包含它们,您还需要使用-notlike '*'进行显式匹配,因为-eq ''和-eq $NULL不是有效过滤器。请注意,这是 -Filter 的一个怪癖,使用直接的 -LdapFilter 会否定匹配空值。
下面是一个 Filter 和 LdapFilter 的多重匹配示例: