当前位置:  开发笔记 > 编程语言 > 正文

确定已安装的PowerShell版本

如何解决《确定已安装的PowerShell版本》经验,为你挑选了13个好方法。

如何确定计算机上安装的PowerShell版本,实际上是否已安装?



1> 小智..:

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

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

PS C:\> $PSVersionTable.PSVersion

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


`$ PSVersionTable`更可靠,并返回$ PSVersion.你也可以使用`$ PSVersionTable.PSVersion`.即使你远程连接到运行不同版本的机器(`invoke-command -computername myRemotePC -Credential foo {$ host}`),看起来`$ host`只会显示他们同意序列化的最低版本.虽然`$ PSVersionTable`将显示真实版本.希望它会帮助某人..
@Starfish显示的命令使用命令提示符启动Powershell.如果未安装"powershell not found",命令是否会出错?
好像$ host.Version不是一个好选择...如果你远程运行PowerShell 3,你会回到1.0,因为RemotingHost似乎是v1.正确使用$ PSVersionTable返回3.
厌倦了回到这里,我刚刚运行`notepad $ profile`并转储了`function psver {$ PSVersionTable; $ PSVersionTable.PSVersion}`里面.用`重新加载.$ profile`我可以随时输入`psver`来获取详细的版本信息和其他详细信息.
@DanielCassidy - 晚会迟了两年,但"一些功能无法解释"可能是因为只安装了.Net 3.5 Compact框架而不是完整的东西.

2> Thomas Bratt..:

我会使用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


接受的答案陈述*"... $ Host.Version和(Get-Host).Version不可靠 - 它们只反映主机的版本,而不是引擎"*.
谢谢!注意:在我从v1 Powershell手动升级的XP中,实际的文件夹和注册表路径(误导性地?!)引用v1 NOT v2.正如其他人在这里指出的那样,但这就是为什么我担心我是否安装它的原因.我的道路是; C:\ WINDOWS\SYSTEM32\windowspowershell\V1.0
如果$ psversiontable不存在,那么假设你在v1.0上是完全安全的 - 并且嘿presto,这也回答了你的问题.`$ host.version`不可靠 - 例如在powergui中,它返回的powergui主机版本与powershell引擎版本不同(这是所需的.)

3> MagicAndi..:

要确定是否已安装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"}
}


对于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").
有用的,因为在Windows 2003服务器上我无法找到PowerShell中的开始菜单项(这是有,但不是很明显),但该注册表项回答我的问题.

4> Andy Schneid..:

你可以看一下内置变量$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    



5> Patrick Bard..:

只想在这里加2美分.

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

powershell -Command "$PSVersionTable.PSVersion"

编辑:

根据@psaul你实际上可以有一个与它来自哪里无关的命令(CMD,Powershell或Pwsh),谢谢你.

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

我已经测试过,它在CMD和Powershell上都运行良好

图片


@tresf(和@Gonmator)你可以从CMD,PowerShell甚至是Pwsh(PS 6.0)中运行它,但是你需要使用这个形式:powershell -command"(Get-Variable PSVersionTable -ValueOnly).PSVersion"(这将是在所有情况下工作)

6> Eclipses..:

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

    依次单击"开始","所有程序","附件","Windows PowerShell",然后单击"Windows PowerShell".

    在Windows PowerShell控制台中,在命令提示符处键入以下命令,然后按Enter:

    获取主机| 选择对象版本

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

Get-Host | Select-Object Version

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


接受的答案陈述*"... $ Host.Version和(Get-Host).Version不可靠 - 它们只反映主机的版本,而不是引擎"*.

7> Starfish..:

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>


对于PowerShell 3.0,似乎有一个新的,*HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3*.

8> SharpC..:

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

运行命令提示符(开始,运行cmd,然后确定)

键入powershell然后回车.然后,您应该获得PowerShell PS提示:

C:\Users\MyUser>powershell

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

PS C:\Users\MyUser>

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

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.


如果powershell不在路径中,则此版本会给人一种错误的印象,即它没有安装.Registry方法提供完整信息.存在和版本.
就像[已接受的答案](http://stackoverflow.com/questions/1825585/determine-installed-powershell-version/1825807#1825807)一样,PowerShell 1.0不会返回任何内容。[注册表方法](http://stackoverflow.com/questions/1825585/determine-installed-powershell-version/1825604#1825604)更明确。

9> x0n..:

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

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



10> 小智..:

使用:

$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版本下载详细脚本.



11> Daniel Ellio..:

要检查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

资料来源:本网站.



12> Pecos Bill..:

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

Test 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



13> Roman Pokrov..:

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

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

没有必要记住每个变量.这就Get-Variable足够了("应该有关于版本的东西").


这与`$ PSVersionTable`相同
寻找PS版本?键入$ PSVersion [tab] [enter].完成.不需要记住任何东西:)
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有