Читатель моего сайта пожаловался на неработающий пример сценария 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, следует использовать командлет Get-CimInstance
.
Для того, чтобы привести вывод командлетов к одному виду, достаточно применить команды форматирования. Например Format-List
.
Get-WmiObject -Class Win32_OperatingSystem
Get-CimInstance -Class Win32_OperatingSystem | Format-List
Как видно на скриншоте, вывод результатов работы командлетов после применения команды форматирования стал идентичным.