在PowerShell中,为什么WMI查询返回不需要的字段?

时间:2019-05-02 12:12:36

标签: powershell wmi-query

我正在Powershell ISE中编写一个简单的WMI查询。我只想得到两个字段,但我得到更多

Get-WmiObject -Query "select DisplayName, State from Win32_Service"

我得到的是结果列表,每个结果都有下一个字段,

__GENUS          : 2
__CLASS          : Win32_Service
__SUPERCLASS     : 
__DYNASTY        : 
__RELPATH        : 
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
DisplayName      : Windows Font Cache Service
State            : Running

我注意到所有字段都以双下划线开头,不确定是否有任何含义。我知道我可以得到更好的结果

Get-WmiObject -Class Win32_Service | Select-Object DisplayName, State

但是,我想向该查询添加一个where子句,因此我尝试使用-Query选项。

2 个答案:

答案 0 :(得分:2)

这些字段是内部WMI元数据的一部分。您无法阻止旧版WMI cmdlet返回它们,但是显然您可以使用Select-Object创建一个没有它们的副本,或者使用Format-Table等仅显示您想要查看的内容。

无论如何,现在首选使用“ CIM” cmdlet。因此,在您的情况下,应改为使用以下命令:

Get-CimInstance -Query "select DisplayName, State from Win32_Service"

在此处获取更多信息:

Get-CimInstance

答案 1 :(得分:0)

我已经读到,使用linq这样的.where()方法比使用Where-Object快得多。   这对我有用。不知道您在寻找什么。

resultHash = {
  'project' => 'AAA',
  'Division' => 'BBB',
  'TestingType' => 'CCC',
  'Email' => ['abc@gmail.com', 'def@gmail.com', 'efg@gmail.com']
}

或 您将需要首先使用基于WMI的查询进行过滤。

  (Get-WmiObject -Query "select DisplayName, State from Win32_Service").Where( {$_.State -eq 'Stopped'}) | select Displayname, State