Запуск команд Windows PowerShell из PowerShell (powershell.exe против pwsh.exe)

Вопрос или проблема

  • Запустите pwsh.exe (т.е. C:\program files\PowerShell\7\pwsh.exe)
  • Попробуйте выполнить команду, специфичную для Windows PowerShell, такую как ниже
  • PowerShell (pwsh) не понимает это!
> Get-WmiObject -query "SELECT Version From Win32_OperatingSystem"

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

Единственный способ – это запустить Windows PowerShell (powershell.exe) и затем выполнить его.

Альтернативы (из pwsh):

> powershell Get-WmiObject -query "SELECT Version From Win32_OperatingSystem"

Это не сработает. Поэтому добавьте одинарные кавычки вокруг:

> powershell 'Get-WmiObject -query "SELECT Version From Win32_OperatingSystem"'

Так как же мне это запустить (обратите внимание на 10.0%)?

Get-WmiObject -query "SELECT Version From Win32_OperatingSystem 
   where Version like '10.0%'"

powershell и pwsh запустят разные версии.

Проверьте вывод $PSVersionTable.

Get-WmiObject устарел в PowerShell 3.0 и выше. Эта команда была заменена на Get-CimInstance.

Ответ или решение

Запуск команд Windows PowerShell из PowerShell: powershell.exe против pwsh.exe

Вопрос о различиях между powershell.exe и pwsh.exe становится актуальным, если вам необходимо запустить команды, специфичные для Windows PowerShell, в контексте PowerShell Core и новых версий PowerShell. Давайте разберем это подробнее.

Различия между powershell.exe и pwsh.exe

  • powershell.exe — это исполняемый файл для классической версии Windows PowerShell, которая основана на .NET Framework. Это номер версии 5.1 и ниже. В Windows PowerShell доступны канонические команды (cmdlets), такие как Get-WmiObject, которые обеспечивают доступ к Windows Management Instrumentation (WMI).

  • pwsh.exe — это исполняемый файл для PowerShell Core (начиная с версии 6 и выше), который основан на .NET Core. PowerShell Core более кросс-платформенный и поддерживается на Windows, macOS и Linux.

Проблема с выполнением команд

Как видно из проблемы, команды, предназначенные для Windows PowerShell, такие как Get-WmiObject, не распознаются в pwsh.exe. Это связано с тем, что командлет Get-WmiObject был объявлен устаревшим и заменен командлетом Get-CimInstance, который лучше поддерживает кросс-платформенные сценарии и может быть использован в обеих версиях PowerShell.

Запуск Windows PowerShell из PowerShell Core

Для запуска специфических команд для Windows PowerShell из PowerShell Core (то есть pwsh), вы можете использовать следующий синтаксис:

powershell 'Get-WmiObject -query "SELECT Version From Win32_OperatingSystem"'

Обратите внимание, что следует использовать одинарные кавычки вокруг команды, чтобы передать всю строку как одну команду для выполнения в Windows PowerShell.

Как выполнить комплексный запрос с использованием фильтрации

Если вы хотите выполнить более сложный запрос, например:

Get-WmiObject -query "SELECT Version From Win32_OperatingSystem WHERE Version LIKE '10.0%'"

Вы должы будем обернуть вашу строку в одинарные кавычки, добавив также выдержку с двойными кавычками внутри:

powershell 'Get-WmiObject -query "SELECT Version From Win32_OperatingSystem WHERE Version LIKE ''10.0%''"'

Здесь двойные кавычки внутри одинарных кавычек будут работать правильно, так как PowerShell будет воспринимать одинарные кавычки как пределы строки.

Рекомендуемые альтернативы

С учетом того, что Get-WmiObject устарел, настоятельно рекомендуется использовать Get-CimInstance с аналогичным синтаксисом:

Get-CimInstance -Query "SELECT Version FROM CIM_OperatingSystem WHERE Version LIKE '10.0%'"

Этот командлет будет работать как в pwsh, так и в классическом powershell.exe.

Заключение

Обратите внимание, что при запуске PowerShell команд важно осознавать, какая версия PowerShell используется и какие команды доступны. При миграции на PowerShell Core можете столкнуться с проблемами, связанными с совместимостью, поэтому рекомендуется использовать более современные cmdlets, такие как Get-CimInstance, для полноценной работы кросс-платформенных сценариев.

Используя вышеописанные методы, вы сможете успешно запускать команды Windows PowerShell из PowerShell Core и адаптироваться к изменениям в API командлетов.

Оцените материал
Добавить комментарий

Капча загружается...