dimayakovlev.ru


Ошибка при вызове командлета Get-WmiObject в PowerShell

Читатель моего сайта пожаловался на неработающий пример сценария PowerShell, в котором используется командлет Get-WmiObject. Разберёмся, что произошло.

Попытка вызвать командлет Get-WmiObject приводит к появлению следующей ошибки.

Get-WmiObject -Class Win32_OperatingSystem
Get-WmiObject: The term 'Get-WmiObject' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Описание ошибки прямо отвечает на вопрос о том, что произошло: Get-WmiObject не распознан как имя командлета, функции, файла сценария или исполняемой программы. Но если раньше всё работало, почему теперь командлет исчез, а сценарии, в которых он вызывается, больше не работают?

Произошло это потому что командлеты для работы с Windows Management Instrumentation (WMI) признаны устаревшими и отсутствуют в актуальной версии PowerShell Core, основанного на .NET Core. Замена для этих командлетов готовилась давно. Так в версии PowerShell 3.0 были добавлены командлеты для работы с Common Information Model (CIM), которые можно использовать не только в операционных системах семейства Microsoft Windows.

В качестве замены командлету Get-WmiObject теперь следует использовать командлет Get-CimInstance. При выполнении командлета на локальной машине, результат его работы аналогичен Get-WmiObject, но с другим форматированием вывода: Get-WmiObject выводит результат в виде списка, Get-CimInstance выводит результат в виде таблицы.

Закономерный вопрос: если командлет Get-WmiObject отсутствует в актуальной версии PowerShell, надо ли переписывать старые сценарии? Всё зависит от версии PowerShell в котором выполняется сценарий.

Windows 10 поставляется со встроенным PowerShell 5, в котором доступны командлеты Get-WmiObject и Get-CimInstance. Если планируется продолжать использовать сценарии со встроенной версией PowerShell на Windows 10, переписывать их, заменяя Get-WmiObject на Get-CimInstance, не требуется.

Командная строка PowerShell 5.1 в Windows 10

Однако при разработке новых сценариев, которые планируется использовать в будущем с новыми версиями PowerShell, следует использовать командлет Get-CimInstance.

Командная строка PowerShell 7.3.1 в Windows 10

Для того, чтобы привести вывод командлетов к одному виду, достаточно применить команды форматирования. Например Format-List.

Get-WmiObject -Class Win32_OperatingSystem
Get-CimInstance -Class Win32_OperatingSystem | Format-List

Вывод командлетов Get-WmiObject и Get-CimInstance, приведённый к единой форме

Как видно на скриншоте, вывод результатов работы командлетов после применения команды форматирования стал идентичным.