在过去的一个月里,我一直在学习 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
)取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet(例如,Get-WmiObject
)。因此,应避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) v6+(所有 future 的努力都将用于此)甚至不再它们。但是请注意,WMI 仍然是 CIM cmdlet 的基础。有关详细信息,请参阅 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
关于PowerShell 输出返回的字段多于所选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71897469/