PowerShell 输出 returns 个比所选字段更多的字段

PowerShell output returns more fields than selected

过去一个月我一直在学习 PowerShell,并且经常通过 select 语句或 -properties iirc 发现我获得了我不需要的额外数据。 希望有人能指出为什么它吐出额外的数据。

示例:

Get-WmiObject -query "Select name,vendor,version from win32_product where name = 'Service Name'" -property name,vendor,version

结果:

__GENUS          : 2
__CLASS          : Win32_Product
__SUPERCLASS     : 
__DYNASTY        : 
__RELPATH        : 
__PROPERTY_COUNT : 3
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
Name             : <name stuff>
Vendor           : <vendor stuff>
Version          : <version number stuff>
PSComputerName   : 

当我只指定 3 个时,为什么要给我所有这些附加字段?

首先必须提醒:

  • CIM cmdlet(例如,Get-CimInstance) superseded the WMI cmdlets (e.g., Get-WmiObject) in PowerShell v3 (released in September 2012). Therefore, the WMI cmdlets should be avoided, not least because PowerShell (Core) v6+, where all future effort will go, doesn't even have them anymore. Note that WMI still underlies the CIM cmdlets, however. For more information, see this answer

  • 因此,我在下面使用 Get-CimInstance;将其替换为 Get-WmiObject 通常 有效,但存在一些基本差异 - 请参阅链接的答案。

PowerShell 在事后提取感兴趣的 属性 值更容易,使用 Select-Object:

Get-CimInstance -Class Win32_Product -Filter  "Name = 'Service Name'" | 
  Select-Object -Property name, vendor, version

使用 Select-Object 确保输出对象具有指定的属性 只有 ,而不是 __ 前缀的属性 Get-CimInstance 的输出对象装饰有(除了默认情况下 不显示 的其他通用属性)。

注意:出于性能原因,我怀疑它是必需的,但您也可以限制 属性 源检索 :

$props = 'name', 'vendor', 'version'
Get-CimInstance -Class Win32_Product -Filter  "Name = 'Service Name'"  -Property $props | 
  Select-Object -Property $props