题 确定已安装的PowerShell版本


如何确定计算机上安装的PowerShell版本,以及是否安装了它?


2085
2017-12-01 11:30


起源


犯罪者应该问这个问题。 Microsoft应该提供一种一致的方法来查找所有已安装软件的最新版本。 - user1040323
这种一致的方式将是一个包管理器,我每次使用linux时都会喜欢它。 - aaaaaa


答案:


使用 $PSVersionTable.PSVersion 确定引擎版本。如果变量不存在,则可以安全地假设引擎是版本 1.0

注意 $Host.Version 和 (Get-Host).Version 不可靠 - 他们反映 仅主机版本,而不是引擎。 PowerGUI的, PowerShellPLUS等都是托管应用程序,和 他们将设置主机的版本以反映他们的产品 版本 - 这是完全正确的,但不是你想要的。

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1

2802
2018-01-19 11:06



嗯...刮开最后的评论。似乎PS2已安装,但某些功能无法解释,并且出于某种原因,安装目录名为“1.0”。谢谢微软。 - Daniel Cassidy
$PSVersionTable 更可靠,返回$ PSVersion。你也可以使用 $PSVersionTable.PSVersion。即使您远程连接到运行不同版本的机器(invoke-command -computername myRemotePC -Credential foo {$host}), 看起来像 $host 将只显示他们同意序列化的最低版本。而 $PSVersionTable 将显示真实版本。希望它会帮助某人.. - vulcan raven
好像$ host.Version不是一个好选择...如果你远程运行PowerShell 3,你会回到1.0,因为RemotingHost似乎是v1。正确使用$ PSVersionTable返回3。 - Danny Tuppeny
-1,因为这没有回答如何根据原始问题中的要求确定是否安装了PowerShell。 Microsoft建议检查注册表 查看安装了哪个版本(如果有)。如链接页面所述,此方法是唯一保证长期工作的方法。 - Starfish
@Starfish显示的命令使用命令提示符启动Powershell。如果未安装“powershell not found”,该命令是否会出错? - jpmc26


我也会用 GET-主机 要么 $ PSVersionTable。正如Andy Schneider指出的那样, $PSVersionTable 在版本1中不起作用;它是在第2版中引入的。

get-host

Name             : ConsoleHost
Version          : 2.0
InstanceId       : d730016e-2875-4b57-9cd6-d32c8b71e18a
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-GB
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

$PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4200
BuildVersion                   6.0.6002.18111
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

371
2017-12-01 11:34



谢谢!注意:在我的XP上,我从v1 Powershell手动升级,实际的文件夹和注册表路径(误导性?!)引用v1 NOT v2。就像其他人在这里指出的那样,但这就是为什么我担心我是否安装它的原因。我的道路是; C:\ WINDOWS \ SYSTEM32 \ windowspowershell \ V1.0 - AnneTheAgile
如果$ psversiontable不存在,那么假设你在v1.0上是完全安全的 - 并且嘿presto,这也回答了你的问题。 $host.version 是不可靠的 - 例如在powergui中,它返回的powergui主机版本与powershell引擎版本不同(这是所需的)。 - x0n
尼斯。即使通过get-host cmdlet获取主要版本也是绰绰有余的。 - RBT
接受的答案说明 “... $ Host.Version和(Get-Host).Version不可靠 - 它们只反映主机的版本,而不是引擎”。 - Peter Mortensen


要确定是否已安装PowerShell,您可以检查注册表是否存在

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

如果存在,则值是否为1(已安装),如博客文章中所述 检查是否安装了PowerShell和版本

要确定已安装的PowerShell的版本,可以检查注册表项

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion

要确定从.ps1脚本安装的PowerShell版本,可以使用以下单行程序,详见PowerShell.com 我正在运行哪个PowerShell版本

$isV2 = test-path variable:\psversiontable

同一站点还提供了返回版本的功能:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

87
2017-12-01 14:37



有用,因为在Windows 2003服务器上我找不到PowerShell的开始菜单条目(它存在但不明显),但注册表项回答了我的问题。 - Holistic Developer
+1。这也是 Microsoft建议的方法 用于检测。 - Starfish
对于PowerScript 3.0,似乎有一个新的条目, HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ PowerShell的\ 3 (此外 HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的PowerShell \ 1)。在这种情况下获得版本的适当位置似乎是 HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ PowerShell的\ 3 \ PowerShellEngine \ PowerShellVersion (样本值为“3.0”)。 - Peter Mortensen


你可以看一下内置变量, $psversiontable。如果它不存在,则有V1。如果确实存在,它将为您提供所需的所有信息。

1 >  $psversiontable

Name                           Value                                           
----                           -----                                           
CLRVersion                     2.0.50727.4927                                  
BuildVersion                   6.1.7600.16385                                  
PSVersion                      2.0                                             
WSManStackVersion              2.0                                             
PSCompatibleVersions           {1.0, 2.0}                                      
SerializationVersion           1.1.0.1                                         
PSRemotingProtocolVersion      2.1    

77
2018-04-25 13:47





只想在这里加2美分。

您只能通过调用powershell直接检查一行版本 外部,例如来自命令提示符

powershell -Command "$PSVersionTable.PSVersion"

编辑:

根据 @psaul 您 能够 实际上有一个命令与它来自哪里是不可知的(CMD,Powershell或Pwsh),谢谢你。

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 

我已经测试过,它在CMD和Powershell上都能完美运行

image


23
2018-03-10 11:32



我尝试了这个可怕的错误:“System.Collections.Hashtable.PSVersion:术语'System.Collections.Hashtable.PSVersion'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。“所以并不总是有效 - Gonmator
我很高兴你指出了这一点,因为知道角落的情况很好,但我想它仍适用于大多数人。 - Patrick Bard
@tresf允许我在回复中使用你的话来防止进一步的误解。 - Patrick Bard
@PatrickBard,请做。 - tresf
@tresf(和@Gonmator)你可以从CMD,PowerShell甚至Pwsh(PS 6.0)中运行它,但是你需要使用这个形式:powershell -command“(Get-Variable PSVersionTable -ValueOnly).PSVersion”(这将是在所有情况下工作) - PSaul


您可以通过完成以下检查来验证安装的Windows PowerShell版本:

  1. 依次单击“开始”,“所有程序”,“附件”,“Windows PowerShell”,然后单击“Windows PowerShell”。
  2. 在Windows PowerShell控制台中,在命令提示符处键入以下命令,然后按Enter:

    获取主机|选择对象版本

您将看到如下所示的输出:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/


19
2018-06-17 07:59



您假设PowerShell已使用默认选项安装,并且未从“开始”菜单中删除快捷方式。最好使用注册表测试。 - Xalorous
我认为如果你需要首先使用PowerShell,你可以尝试运行它作为标准它应该安装,然后如果你没有找到你试图搜索它的图标,那么也许你尝试从命令提示符运行它。我不认为你从注册表开始。 - Eclipses
接受的答案说明 “... $ Host.Version和(Get-Host).Version不可靠 - 它们只反映主机的版本,而不是引擎”。 - Peter Mortensen


Microsoft推荐的前向兼容方法,用于检查是否已安装PowerShell并确定已安装的版本 是看两个特定的注册表项。我已经在这里重现了细节,以防链接中断。

根据链接页面:

取决于任何其他注册表项,或PowerShell.exe的版本或PowerShell.exe的位置不能保证长期工作。

检查是否 任何版本 安装PowerShell,检查注册表中的以下值:

  • 关键位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • 值名称:安装
  • 值类型:REG_DWORD
  • 值数据:0x00000001(1

去检查 无论是版本1.0还是2.0 安装PowerShell,检查注册表中的以下值:

  • 关键位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • 值名称:PowerShellVersion
  • 值类型:REG_SZ
  • 价值数据:<1.0 | 2.0>

18
2017-11-04 10:24



对于PowerShell 3.0,似乎有一个新的, HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ PowerShell的\ 3。 - Peter Mortensen
这对win7不起作用。我相信Powershell注册表项现在已被删除。 - N-ate


我找到了检查安装是否最简单的方法:

  • 运行命令提示符(开始,运行, cmd那么OK)
  • 类型 powershell 然后回击。然后你应该得到PowerShell PS 提示:

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

然后,您可以通过键入来从PowerShell提示中检查版本 $PSVersionTable.PSVersion

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

类型 exit 如果你想回到命令提示符(exit 再次,如果你还想关闭命令提示符)。

要运行脚本,请参阅 http://ss64.com/ps/syntax-run.html


11
2017-11-01 01:41



像 接受的答案  这不会为PowerShell 1.0返回任何内容。 注册表方法 更明确。 - Peter Mortensen
如果powershell不在路径中,则此版本会给人一种错误的印象,即它没有安装。 Registry方法提供完整信息。存在和版本。 - Xalorous