确定已安装的PowerShell版本


2631

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

Answers:


3582

使用$PSVersionTable.PSVersion以确定发动机的版本。如果变量不存在,则可以安全地假定引擎为version 1.0

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

PS C:\> $PSVersionTable.PSVersion

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

2
@DanielCassidy-晚会晚了两年,但是“某些功能是无法使用的”可能是由于仅安装了.Net 3.5 Compact框架而不是完整组件而引起的。
Dave Neeley 2012年

83
$PSVersionTable更可靠,并返回$ PSVersion。您也可以使用$PSVersionTable.PSVersion。即使您远程连接到运行不同版本(invoke-command -computername myRemotePC -Credential foo {$host})的计算机,它看起来$host也只会显示他们同意进行序列化的最低版本。虽然$PSVersionTable会显示真实版本。希望它能对某人有所帮助..
火神乌鸦

16
似乎$ host.Version不是一个不错的选择...如果您远程到运行PowerShell 3的计算机,您将获得1.0,因为RemotingHost似乎是v1。使用$ PSVersionTable正确返回3
丹尼Tuppeny

25
@Starfish显示的命令使用命令提示符启动Powershell。如果未安装该命令,是否会因“ powershell not found”而出现错误?
jpmc26 2013年

9
厌倦了回到这里的notepad $profile烦恼function psver { $PSVersionTable; $PSVersionTable.PSVersion },以至于我只好跑去扔了。重新加载后. $profile,我可以随时输入psver以获取详细的版本信息和其他详细信息。
ADTC

432

我将使用Get-Host$ 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

5
谢谢!注意:在我从v1 Powershell手动升级的XP上,实际的文件夹和注册表路径(误导?!)参考v1而不是v2。这就是这里其他人指定的,但这是我如此担心是否安装它的原因。我的道路是; C:\ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile 2012年

4
如果$ psversiontable不存在,则完全可以假设您使用的是v1.0-嗨,很高兴,这也回答了您的问题。$host.version是不可靠的-例如在PowerGUI的,则返回的PowerGUI主机版本,这是不一样的的powershell引擎版本(这是什么是需要的。)
x0n

10
接受的答案指出“ ... $ Host.Version和(Get-Host).Version不可靠-它们仅反映主机的版本,而不反映引擎的版本”
Peter Mortensen

99

您可以查看内置变量$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    

96

要确定是否已安装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版本的PowerShell.com上所述

$isV2 = test-path variable:\psversiontable

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

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

4
有用的原因是,在Windows 2003服务器上,我找不到PowerShell的开始菜单项(该菜单项存在,但不明显),但是注册表项回答了我的问题。
整体开发人员

7
对于PowerScript 3.0,似乎有一个新条目HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3(除了HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1)。在这种情况下,获取版本的正确位置似乎是HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion(示例值为“ 3.0”)。
彼得·莫滕森

47

您只能通过从外部调用PowerShell (例如从命令提示符)直接用一行来检查版本。

powershell -Command "$PSVersionTable.PSVersion"

根据@psaul的说法,实际上可以使用一个与它的来源无关的命令(CMD,PowerShell或Pwsh)。谢谢你

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

我已经测试过,它在CMD和PowerShell上都可以正常工作。

图片


我尝试以下操作得到了一个可怕的错误:“ System.Collections.Hashtable.PSVersion:术语'System.Collections.Hashtable.PSVersion'无法识别为cmdlet,函数,脚本文件或可运行程序的名称。名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。” 因此,并非总是有效
Gonmator

我很高兴您指出这一点,因为知道一些棘手的案例是件好事,但我想它仍然适用于大多数人。
帕特里克·巴德

@Gonmator会认为PowerShell对此命令的行为相同,但不幸的是却没有。我做了尝试不可知固定的语法来工作cmd,并powershell无济于事。我也会期望同样的行为。:)
tresf

3
@tresf(和@Gonmator)可以从CMD,PowerShell甚至Pwsh(PS 6.0)不可知地运行,但是您需要使用以下形式:powershell -command“(Get-Variable PSVersionTable -ValueOnly).PSVersion”(工作)
PSaul

在Mac上也测试过。 pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 效果很好。
tresf

37

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

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

    Get-Host | Select-Object Version

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

Version
-------
3.0

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


1
您假定已使用默认选项安装了Powershell,并且快捷方式并未从“开始”菜单中删除。最好使用注册表测试。
Xalorous 2015年

我认为,如果您首先需要使用PowerShell,则尝试按标准安装它的方式运行它,然后,如果找不到要搜索的图标,则可以尝试从命令提示符处运行它。我不认为您是从注册表开始的。

6
接受的答案指出“ ... $ Host.Version和(Get-Host).Version不可靠-它们仅反映主机的版本,而不反映引擎的版本”
Peter Mortensen

21

Microsoft建议使用向前兼容的方法来检查是否已安装PowerShell并确定已安装的版本是查看两个特定的注册表项。如果链接断开,我将在此复制详细信息。

根据链接的页面:

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

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

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

要检查是否已安装PowerShell的1.0版或2.0版,请在注册表中检查以下值:

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

5
对于PowerShell 3.0,似乎有一个新的HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3
彼得·莫滕森

11

我发现检查安装是否最简单的方法是:

  • 运行命令提示符(“开始”,“运行”,cmd“然后确定”)
  • 输入,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


3
就像接受的答案一样, PowerShell 1.0不会返回任何内容。注册表方法更加明确。
彼得·莫滕森

4
如果该路径中没有powershell,则此版本会给人一个错误的印象,即未安装它。Registry方法提供了完整的信息。存在和版本。
Xalorous

9

$host.version只是错误的/不可靠的。这为您提供了托管可执行文件的版本(powershell.exe,powergui.exe,powershell_ise.exe,powershellplus.exe等),而不是引擎本身的版本。

引擎版本包含在中$psversiontable.psversion。对于PowerShell 1.0,此变量不存在,因此很明显,如果此变量不可用,则可以很明显地假定引擎为1.0。


9

采用:

$psVersion = $PSVersionTable.PSVersion
If ($psVersion)
{
    #PowerShell Version Mapping
    $psVersionMappings = @()
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14393.0';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows 10 Anniversary Update'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14300.1000';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows Server 2016 Technical Preview 5'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.494';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3172985 1607'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.122';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3140743 1603'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.117';FriendlyName='Windows PowerShell 5 RTM 1602';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.63';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3135173 1602'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.51';FriendlyName='Windows PowerShell 5 RTM 1512';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10514.6';FriendlyName='Windows PowerShell 5 Production Preview 1508';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10018.0';FriendlyName='Windows PowerShell 5 Preview 1502';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.9883.0';FriendlyName='Windows PowerShell 5 Preview November 2014';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows 8.1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='4.0';FriendlyName='Windows PowerShell 4 RTM';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='3.0';FriendlyName='Windows PowerShell 3 RTM';ApplicableOS='Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='2.0';FriendlyName='Windows PowerShell 2 RTM';ApplicableOS='Windows Server 2008 R2 SP1 and Windows 7'}
    foreach ($psVersionMapping in $psVersionMappings)
    {
        If ($psVersion -ge $psVersionMapping.Name) {
            @{CurrentVersion=$psVersion;FriendlyName=$psVersionMapping.FriendlyName;ApplicableOS=$psVersionMapping.ApplicableOS}
            Break
        }
    }
}
Else{
    @{CurrentVersion='1.0';FriendlyName='Windows PowerShell 1 RTM';ApplicableOS='Windows Server 2008, Windows Server 2003, Windows Vista, Windows XP'}
}

您可以从“ 如何确定已安装的PowerShell版本”中下载详细脚本。


8

忘记此页面而永不返回的最简单方法是学习Get-Variable

Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}

无需记住每个变量。只要Get-Variable足够(和“应该有一些关于版本”)。


8
$PSVersionTable
–adad

6
寻找PS版本?键入$ PSVersion [选项卡] [输入]。做完了 不需要记住任何事情:)
orad 2014年

1
这仅在非常熟悉所使用的管道技巧的情况下才有用。初学者没有比记住$ PSVersionTable更容易记住所有语法的方法
Joseph Gabriel

1
伙计们,Get-Variable可以单独很好地工作(如果只是获得版本所需的一切),管道传递只是个玩笑:)我也不记得管道传递语法。
Roman Pokrovskij

7

要检查是否已安装PowerShell,请使用:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

要检查是否已安装RC2或RTM,请使用:

HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM

资料来源:本网站


7

由于最有帮助的答案没有解决if是否存在的问题,我想我会通过一种快速而又肮脏的解决方案来解决这个问题。它取决于PowerShell是否位于您可能想要的路径环境变量中。(因为我不知道,所以提示了最佳答案的提示。)将其粘贴到文本文件中并命名

测试Powershell Version.cmd

或类似。

@echo off
echo Checking powershell version...
del "%temp%\PSVers.txt" 2>nul
powershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nul
if errorlevel 1 (
 echo Powershell is not installed. Please install it from download.Microsoft.com; thanks.
) else (
 echo You have installed Powershell version:
 type "%temp%\PSVers.txt"
 del "%temp%\PSVers.txt" 2>nul
)
timeout 15

4

我需要检查PowerShell的版本,然后运行适当的代码。我们的某些服务器运行v5,而其他服务器运行v4。这意味着某些功能(例如compress)可能会或可能不会可用。

这是我的解决方案:

if ($PSVersionTable.PSVersion.Major -eq 5) {
    #Execute code available in PowerShell 5, like Compress
    Write-Host "You are running PowerShell version 5"
}
else {
    #Use a different process
    Write-Host "This is version $PSVersionTable.PSVersion.Major"
}


1

这是“批处理文件获取Powershell版本”的顶部搜索结果,因此,我想提供一个基本示例,说明如何根据Powershell版本在批处理文件中进行条件流

通用示例

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    echo Do some fancy stuff that only powershell v5 or higher supports
) else (
    echo Functionality not support by current powershell version.
)

现实世界的例子

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    rem Unzip archive automatically
    powershell Expand-Archive Compressed.zip
) else (
    rem Make the user unzip, because lazy
    echo Please unzip Compressed.zip prior to continuing...
    pause
)

0

您也可以从PowerShell命令行调用“主机”命令。它应该给你$host变量的值。


3
这是半错误的。 host决定解决Get-Host。无论如何,这不是获取版本的可靠方法。
马克西米利安·伯兹利

-1

用选择运算符扩展答案:

Get-Host | select {$_.Version}

7
接受的答案指出“ ... $ Host.Version和(Get-Host).Version不可靠-它们仅反映主机的版本,而不反映引擎的版本”
Peter Mortensen

@PeterMortensen看起来我的答案早于被接受的答案
HaBo

2
@HaBo你在看什么?接受的答案是从2009
。– TylerH

@TylerH那又如何?我没有关注你的问题。我的答案清楚地说是对已接受答案的扩展。其简化版本。
HaBo

2
@HaBo您先前的评论听起来像是在将您的答案发布在接受的答案之前,以此来为您的答案辩护,但事实并非如此。您的答案是在接受答案的7年后发布的,而答案实际上是在6年后发布的。说到这,您的答案并没有明确表示它是已接受答案的扩展(甚至没有使用Get-Host)。
TylerH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.