我最近写了这个答案并偶然发现了一些有趣的东西。
get-aduser -filter {-not (description -eq "auto")} | measure-object
和
get-aduser -filter {description -ne "auto"} | measure-object
对相同数据运行时返回两个非常不同的东西,第一个命令返回预期值。乍一看,在描述字段中具有空值的用户不会作为第二个命令中的匹配项返回,即使 NULL 显然不等于“自动”。
聊天中的几个人看过这个并证实我没有疯。这里发生了什么?
两者之间的主要区别是第一个命令不涉及直接比较值来获取所有结果,而第二个命令则涉及。第一个命令包含 NULL 结果,第二个命令不包含(正如 MDMarra 已经发现的那样)。这两个命令都以此 cmdlet 开头:
get-aduser
Run Code Online (Sandbox Code Playgroud)
在执行以下操作时,请记住,此 cmdlet 的结果包括所有 AD 用户,无论-filter
其后面的参数中的其他内容如何。
现在让我们分解两个不同的部分。第一个:
{-not (description -eq "auto")}
Run Code Online (Sandbox Code Playgroud)
...方法
-eq
员能够将其与“auto”进行比较。从中删除 NULL 值比较,因为它无法将 NULL 与字符串值进行比较。-eq
filter 参数给我所有不是 的结果的内容(description -eq "auto")
,其中将包括 NULL,因为原始 cmdletget-aduser
包括所有 AD 用户。它不必与-not
操作员将任何东西与其他东西进行比较。它只是为您提供了除了过滤器结果之外的所有内容(description -eq "auto")
。在您的示例中,假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不同于“auto”,还有数百个用户的描述为 NULL。单步执行命令逻辑将会执行以下操作:
由于它不必使用-not
运算符将任何内容与其他任何内容进行比较,因此结果包括在原始get-aduser
cmdlet 中捕获的 NULL 描述用户。
第二条命令:
{description -ne "auto"}
Run Code Online (Sandbox Code Playgroud)
...方法
-ne
能够将其与“auto”进行比较。NULL 值从此比较中删除,因为它无法将 NULL 与字符串值进行比较。在您的示例中,再次假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不同于“auto”,还有数百个用户的描述为 NULL。单步执行命令逻辑将会执行以下操作:
无论哪种方式,这两个命令之间的整体差异绝对是不直观的。
使用此命令,您应该能够使用“-and”捕获 NULL,如下所示:
{description -ne "auto" -and description -ne $NULL}
Run Code Online (Sandbox Code Playgroud)
我不是 100% 熟悉语法,因为我现在无法测试它,而且可能还有比这更好的方法。当它全部分解时,它是相当反气候的,需要大量的打字来解释,但在使用各种运算符和大量的试验和错误之前,我遇到过这样奇怪的东西,因为我永远记不起所有的警告这与使用每一个都相伴随。
参考:http ://technet.microsoft.com/en-us/library/hh847732.aspx :
比较运算符
使用比较运算符(-eq、-ne、-gt、-lt、-le、-ge)来比较值和测试条件。例如,您可以比较两个字符串值以确定它们是否相等。
比较运算符包括匹配运算符(-match、-notmatch),它使用正则表达式查找模式;替换运算符(-replace),它使用正则表达式来更改输入值;like 运算符(-like、-notlike),使用通配符 (*) 查找模式;以及包含运算符(in、-notin、-contains、-notcontains),它们确定测试值是否出现在参考集中。
它们还包括按位运算符(-bAND、-bOR、-bXOR、-bNOT)来操作值中的位模式。
有关详细信息,请参阅 about_Comparison_Operators
逻辑运算符
使用逻辑运算符(-and、-or、-xor、-not、!)将条件语句连接成单个复杂条件。例如,您可以使用逻辑 -and 运算符来创建具有两个不同条件的对象过滤器。
有关详细信息,请参阅 about_Logical_Operators。
归档时间: |
|
查看次数: |
3429 次 |
最近记录: |