【问题标题】:In PowerShell, why does WMI query returns unwanted fields?在 PowerShell 中,为什么 WMI 查询会返回不需要的字段?
【发布时间】:2019-05-02 12:12:35
【问题描述】:

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

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

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

__属:2 __CLASS : Win32_Service __超类: __DYNASTY : __RELPATH : __PROPERTY_COUNT : 2 __派生:{} __服务器 : __命名空间: __小路 : DisplayName : Windows 字体缓存服务 状态:运行

我注意到这些字段都以双下划线开头,不确定它是否意味着什么。我知道我可以得到更好的结果

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

但是,我想在这个查询中添加一个where 子句,所以我尝试使用-Query 选项。

【问题讨论】:

  • 您仍然可以使用 WHERE 子句:get-wmiobject -query "select DisplayName, State from Win32_service WHERE ..." | select-object DisplayName, State
  • 或者你可以使用where-object,例如get-wmiobject -class win32_service | where-object -Property State -EQ -Value "Stopped" | select-object DisplayName, State
  • 这是Get-WmiObject 的格式文件的一部分,它规定了该cmdlet 中的对象如何打印到控制台。您要么必须手动编辑它,要么简单的方法就是使用 Select-Object cmdlet。

标签: powershell wmi-query


【解决方案1】:

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

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

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

在此处获取更多信息:

Get-CimInstance

【讨论】:

    【解决方案2】:

    我已经读过,使用 .where() 之类的 linq 方法比使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2020-11-18
      • 1970-01-01
      • 2018-01-12
      • 2023-04-04
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多