在 PowerShell 中,为什么 WMI 会查询 returns 个不需要的字段?

In PowerShell, why does WMI query returns unwanted fields?

我正在 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 选项。

我读到使用 linq like .where() 方法比使用 Where-Object 快得多。 这对我有用。不确定您还需要什么。

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

或者 您需要先使用基于 WMI 的查询进行筛选。

Get-WmiObject -Query "select DisplayName, State from Win32_Service where State ='Stopped'" | select Displayname, State

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

无论如何,'CIM' cmdlet 现在是首选。所以在你的情况下,你应该改用这个命令:

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

在此处获取更多信息:

Get-CimInstance