确定已安装的PowerShell版本

Determine installed PowerShell version

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


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

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

1
2
3
4
5
PS C:\> $PSVersionTable.PSVersion

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


我会使用Get-Host或$ PSVersionTable。正如Andy Schneider所指出的,$psversiontable在版本1中不起作用;它是在第2版中引入的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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


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

1
2
3
4
5
6
7
8
9
10
11
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

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

1
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

如果存在,则值是否为1(已安装),详见博客文章检查PowerShell是否已安装和版本。

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

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

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

要确定从.ps1脚本安装的PowerShell版本,可以使用以下单行,如PowerShell.com上详细介绍的PowerShell版本运行。

1
$isV2 = test-path variable:\psversiontable

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

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


您可以通过外部调用PowerShell直接检查版本,例如从命令提示符

1
powershell -Command"$PSVersionTable.PSVersion"

根据@psaul,您实际上可以拥有一个与其来源无关的命令(CMD,PowerShell或Pwsh)。谢谢你。

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

我已经测试过,它在CMD和PowerShell上都运行得很完美。

Image


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

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

    1
    Get-Host | Select-Object Version
  • 您将看到如下所示的输出:

    1
    2
    3
    Version
    -------
    3.0

    HOW TO verify the Windows PowerShell version installed


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

    根据链接页面:

    Depending on any other registry key(s), or version of PowerShell.exe or the location of PowerShell.exe is not guaranteed to work in the long term.

    要检查是否安装了任何版本的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>


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

    • 运行命令提示符(开始,运行,cmd,然后确定)
    • 输入powershell然后点击返回。然后,您应该获得PowerShell PS提示符:
    1
    2
    3
    4
    5
    6
    C:\Users\MyUser>powershell

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

    PS C:\Users\MyUser>

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

    1
    2
    3
    4
    5
    6
    7
    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。


    使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $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版本下载详细脚本。


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

    引擎版本包含在$PSVersionTable.PSVersion中。对于PowerShell 1.0,此变量不存在,因此很明显,如果此变量不可用,则显然假设引擎为1.0是完全安全的。


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

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

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

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

    资料来源:本网站。


    由于最有帮助的答案没有解决if存在部分,我想我会通过一个快速而肮脏的解决方案来解决它。它依赖于PowerShell在路径环境变量中,这可能是你想要的。 (帽子提示顶部答案,因为我不知道。)将其粘贴到文本文件中并命名

    Test Powershell Version.cmd

    或类似的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @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

    忘记这个页面并且永远不会回到它的最简单的方法是学习Get-Variable

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

    没有必要记住每个变量。只需Get-Variable即可(以及"应该有关于版本的东西")。


    以下cmdlet将返回PowerShell版本。

    1
    $PSVersionTable.PSVersion.Major


    我需要检查PowerShell的版本,然后运行相应的代码。我们的一些服务器运行v5,其他服务器运行v4。这意味着某些功能(如压缩)可能可用,也可能不可用。

    这是我的解决方案:

    1
    2
    3
    4
    5
    6
    7
    8
    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"
    }

    您还可以从PowerShell命令行调用"host"命令。它应该给你$host变量的值。


    这是"批处理文件获取powershell版本"的首选搜索结果,因此我想提供一个基于如何在批处理文件中执行条件流的基本示例,具体取决于powershell版本

    通用的例子

    1
    2
    3
    4
    5
    6
    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.
    )

    现实世界的例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    )

    使用select运算符扩展答案:

    1
    Get-Host | select {$_.Version}


    这里有很多答案。我以为我会把我放在这里,因为它很短,并说主要和次要版本在一起。

    1
    $psMajorVer = $PSVersionTable.PSVersion.Major.ToString();$psMinorVer = $PSVersionTable.PSVersion.Minor.ToString();Write-Host"You have Powershell version" -NoNewline; Write-Host ($psMajorVer +"." + $psMinorVer);