И в «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. ☝🏼😉