- Вопрос или проблема
- Ответ или решение
- Запуск команд Windows PowerShell из PowerShell: powershell.exe против pwsh.exe
- Различия между powershell.exe и pwsh.exe
- Проблема с выполнением команд
- Запуск Windows PowerShell из PowerShell Core
- Как выполнить комплексный запрос с использованием фильтрации
- Рекомендуемые альтернативы
- Заключение
Вопрос или проблема
- Запустите
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 командлетов.