Get-WmiObject使用AND或OR(它们以相反的方式工作)

时间:2018-05-03 17:30:26

标签: filtering wmi

似乎使用多个条件(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过滤,它们完全符合人们的预期,那么为什么我看到这种向后行为呢?

其他人可以重新创建我的问题,或者弄清楚为什么我会在我的环境中看到这个问题?感谢

1 个答案:

答案 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$')":比较运算符否定