Почему в PowerShell запрос WMI возвращает ненужные поля? - PullRequest
0 голосов
/ 02 мая 2019

Я пишу простой запрос WMI в ISE powershell. Я хочу получить только два поля, но я получаю больше

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 ]

2 голосов
/ 02 мая 2019

Эти поля являются частью внутренних метаданных WMI.Вы не можете помешать старым командлетам WMI возвращать их, но вы можете явно использовать Select-Object, чтобы создать копию без них, или Format-Table и т. Д., Чтобы отображать только то, что вы хотите видеть.

Inв любом случае, командлеты CIM сейчас являются предпочтительным вариантом.Так что в вашем случае вы должны использовать эту команду вместо:

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

Получить дополнительную информацию здесь:

Get-CimInstance

0 голосов
/ 02 мая 2019

Я читал, что использование метода linq наподобие .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
...