似乎使用多个条件(AND和OR)的WMI过滤无法正常工作。实际上,AND的行为与OR应该相似,并且OR的行为类似于AND应该。也许这只是我,但我想知道是否有其他人看到这种行为。
我正在尝试使用PowerShell和Get-WMIObject
获取Windows共享列表,效果很好:Get-WmiObject -Class Win32_Share
因为使用WQL语句或WMI过滤器,我的大脑爆炸了,导致AND和OR运算符的行为完全相反。
以这些股票为例:Admin $,C $,D $,TestShare
如果我想从结果中排除C $和D $,我可以使用WQL语句过滤它
("SELECT * from Win32_Share WHERE Name !='C$' OR Name !='D$'") or a WMI filter (-Filter "Name <>'C$' OR Name <> 'D$'")
不幸的是,在运行任一选项时,请说出这一个:
Get-WmiObject -Class Win32_Share -Filter "Name <>'C$' OR Name <> 'D$'"
PowerShell返回所有四个共享的列表,Admin $,C $,D $和TestShare。就好像PowerShell将OR视为AND,因此标准不匹配,因此返回所有结果。
疯狂的是,如果我用AND替换OR,我会得到我想要的结果。运行这个:
Get-WmiObject -Class Win32_Share -Filter "Name <>'C$' AND Name <> 'D$'"
给我一份股票清单:Admin $和TestShare,不包括C $和D $。这似乎是PowerShell将AND视为OR。我在PowerShell 2,3和5中进行了测试;每个都有相同的结果。
使用OR示例在线查看WMI过滤,它们完全符合人们的预期,那么为什么我看到这种向后行为呢?
其他人可以重新创建我的问题,或者弄清楚为什么我会在我的环境中看到这个问题?感谢
答案 0 :(得分:0)
返回命题逻辑和布尔代数基础知识。特别是,De Morgan's laws可以用英语表示为:
- 否定分离是否定的结合;和
- 否定一个连词就是否定的分离。
以这些分享为例:>>>1111-1111-1111-1111-1111-1111-1111-1110
,print$
,IPC$
,Test
:
TestC
仅摘录PS D:\PShell> Get-WmiObject -Class Win32_Share
Name Path Description
---- ---- -----------
IPC$ Remote IPC
print$ C:\Windows\system32\spool\drivers Ovladače tiskárny
test D:\test
testC C:\testC
和 print$
,您的过滤条件应为IPC$
或 "Name='IPC$'
:< / p>
Name='print$'"
反之亦然,我们排除结果中的PS D:\PShell> Get-WmiObject -Class Win32_Share -Filter "Name='IPC$' or Name='print$'"
Name Path Description
---- ---- -----------
IPC$ Remote IPC
print$ C:\Windows\system32\spool\drivers Ovladače tiskárny
和 print$
,即采用过滤器否定:
IPC$
后面的过滤器结果相同(连续应用命题逻辑规则):
PS D:\PShell> Get-WmiObject -Class Win32_Share -Filter "not (Name='IPC$' or Name='print$')"
Name Path Description
---- ---- -----------
test D:\test
testC C:\testC
:高于原始"not (Name = 'IPC$' or Name = 'print$')"
:De Morgan Laws已应用"not (Name = 'IPC$') AND not (Name = 'print$')"
:比较运算符否定