И в «PowerShell 7», и в «Windows PowerShell», когда я делаю pwsh --version, я получаю PowerShell 7.4.5.
Однако в «Windows PowerShell», когда я делаю Set-PSReadLineOption -PredictionSource HistoryAndPlugin [1], я получаю следующую ошибку
Set-PSReadLineOption : The prediction plugin source is not supported in this version of PowerShell. The 7.2 or a
higher version of PowerShell is required to use this source.
At line:1 char:1
+ Set-PSReadLineOption -PredictionSource HistoryAndPlugin
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Set-PSReadLineOption], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.SetPSReadLineOption
указывая, что «Windows PowerShell» на самом деле не находится в версии 7.4.5. Так как же мне получить актуальную версию «Windows PowerShell»?
Наличие двух PowerShell уже достаточно сбивает с толку. Похоже, что «PowerShell 7» передает состояние «Windows PowerShell», чтобы он сказал, что находится в версии 7.4.5, хотя это не так.
Есть какие-нибудь рекомендации, чтобы избежать путаницы в будущем? Должен ли я использовать исключительно PowerShell 7?
[1] команда исходит от Документация PowerShell «Использование предикторов в PSReadLine»





pwsh --version дает версию «PowerShell 7», хотя я назвал ее из «Windows PowerShell», но $PSVersionTable дает правильную версию:
pwsh --versionвозвращает версию команды pwsh.exe , а не версию текущего CLI (интерфейса командной строки). Я предполагаю, что этот параметр взят из кроссплатформенной операционной системы Linux, см. также: Как проверить установленную версию программы?
Это означает, что pwsh --version действительно должен возвращать собственный номер версии исполняемого файла (например, PowerShell 7.4.5), даже если вы дадите эту команду из другой оболочки, как подсказывает старый добрый cmd. Точно так же, как и наоборот — использование команды cmd --version в PowerShell (или любом другом CLI) — вернет версию команды CMD:
cmd --version
Microsoft Windows [Version 10.0.19045.4780]
(c) Microsoft Corporation. All rights reserved
Как вы сами выяснили, правильный способ проверить текущую версию PowerShell — использовать команду $PSVersionTable (см. также: Определить установленную версию PowerShell):
# Windows PowerShell
$PSVersionTable
Name Value
---- -----
PSVersion 5.1.19041.4780
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.4780
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Это представляет текущую версию PowerShell, соответствующую той же версии исполняемого файла (pwsh.exe), которая была первоначально запущена (возможно, с помощью ярлыка).
Это также будет показано в следующей команде, которая открывает временную оболочку (PowerShell 7.4.5) и возвращает результаты в текущей командной строке независимо от текущего CLI (версии):
pwsh -Command '$PSVersionTable'
Name Value
---- -----
PSVersion 7.4.5
PSEdition Core
GitCommitId 7.4.5
OS Microsoft Windows 10.0.19045
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
К вашему сведению: я открыл проблему с документом, чтобы сделать pwsh --version более понятным, см.: #11373 pwsh --version
pwsh— это имя исполняемого файла PowerShell 7. Конечно, он возвращает версию 7, потому что это версия 7. ☝🏼😉