确定安装的PowerShell版本

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

3066025 次浏览

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

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

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

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

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

来源:本网站

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

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

PS C:\> $PSVersionTable.PSVersion
Major  Minor  Build  Revision-----  -----  -----  --------4      0      -1     -1

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

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

我会使用获取主机$PSVersionTable值。正如Andy Schneider指出的那样,$PSVersionTable在版本1中不起作用;它是在版本2中引入的。

get-host
Name             : ConsoleHostVersion          : 2.0InstanceId       : d730016e-2875-4b57-9cd6-d32c8b71e18aUI               : System.Management.Automation.Internal.Host.InternalHostUserInterfaceCurrentCulture   : en-GBCurrentUICulture : en-USPrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxyIsRunspacePushed : FalseRunspace         : System.Management.Automation.Runspaces.LocalRunspace
$PSVersionTable
Name                           Value----                           -----CLRVersion                     2.0.50727.4200BuildVersion                   6.0.6002.18111PSVersion                      2.0WSManStackVersion              2.0PSCompatibleVersions           {1.0, 2.0}SerializationVersion           1.1.0.1PSRemotingProtocolVersion      2.1

您还可以从PowerShell命令行调用“host”命令。它应该为您提供$host变量的值。

$host.version是完全错误的/不可靠的。这给了你主机可执行文件的版本(powershell.exe,powergui.exe,powershell_ise.exe,powershellplus.exe等)和没有引擎本身的版本。

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

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>

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

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

没有必要记住每个变量。只需Get-Variable就足够了(和“应该有一些关于版本的东西”)。

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

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

    Get-Host | Select-Object Version

You will see output that looks like this:

Version-------3.0

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

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

测试PowerShellVersion.cmd

或类似。

@echo offecho Checking powershell version...del "%temp%\PSVers.txt" 2>nulpowershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nulif 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

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

  • 运行命令提示符(开始、运行、cmd,然后确定)
  • 键入powershell,然后返回。然后您应该会收到PowerShellPS提示符:

C:\Users\MyUser>powershell
Windows PowerShellCopyright (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

使用选择运算符扩展答案:

Get-Host | select {$_.Version}

用途:

$psVersion = $PSVersionTable.PSVersionIf ($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版本下载详细的脚本。

下面的cmdlet将返回PowerShell版本。

$PSVersionTable.PSVersion.Major

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

powershell -Command "$PSVersionTable.PSVersion"

根据@刘德华,您的可以实际上有一个不可知论的命令(CMD、PowerShell或Pwsh)。谢谢你。

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

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

图像

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

这是我的解决方案:

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

这是“Batch file get PowerShell version”的热门搜索结果,因此我想提供一个基本示例,说明如何根据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 automaticallypowershell Expand-Archive Compressed.zip) else (rem Make the user unzip, because lazyecho Please unzip Compressed.zip prior to continuing...pause)

我做了一个小批量脚本可以确定PowerShell版本:

@echo offfor /f "tokens=2 delims=:" %%a in ('powershell -Command Get-Host ^| findstr /c:Version') do (echo %%a)

这只是使用Get-Host提取PowerShell的版本并搜索字符串Version

当找到包含版本的行时,它使用for命令提取版本。在这种情况下,我们说分隔符是冒号,然后在第一个冒号旁边搜索,从而导致我的case5.1.18362.752

我在version 7.1.0上尝试了这个,它奏效了:

$PSVersionTable | Select-Object PSVersion

输出

PSVersion---------7.1.0

但是它在version 5.1上不起作用,所以宁愿在7以下的版本上这样做:

$PSVersionTable.PSVersion

输出

Major  Minor  Build  Revision-----  -----  -----  --------5      1      18362  1171

编辑

从PowerShell 7.2.5开始,您现在可以执行:

pwsh -v

pwsh --version

输出

PowerShell 7.2.5

PowerShell7

公认的答案仅适用于计算机上安装了一个版本的PowerShell。随着PowerShell 7的出现,这种情况变得越来越不可能。

Microsoft的留档声明在安装PowerShell 7时创建其他注册表项:

从PowerShell 7.1开始,[安装程序]包创建注册表项存储PowerShell的安装位置和版本。这些值位于HKLM\Software\Microsoft\PowerShellCore\InstalledVersions\<GUID>. The<GUID>的值对于每个构建类型(发布或预览)都是唯一的,主要版本和架构。

探索上述位置的注册表会发现以下注册表值:SemanticVersion。此值包含我们查找的信息。

在我的电脑上,它看起来像这样:

Path                                                                                           Name              Type Data----                                                                                           ----              ---- ----HKLM:\SOFTWARE\Microsoft\PowerShellCore\InstalledVersions\31ab5147-9a97-4452-8443-d9709f0516e1 SemanticVersion String 7.1.3

在Windows注册表编辑器中显示指定键的图像

如您所见,我的计算机上安装的PowerShell 7版本是7.1.3。如果目标计算机上安装的PowerShell 7是没有,则整个密钥不应存在。

如Microsoft留档中所述,注册表路径将根据安装的PowerShell版本略有不同。

在某些情况下,部分关键路径更改可能会带来挑战,但对于那些对基于命令行的解决方案感兴趣的人来说,PowerShell本身可以轻松处理此问题。

用于查询此注册表值中数据的PowerShell cmdlet是#0cmdlet。观察它的使用和输出如下(注意使用星号通配符字符代替可能更改的键路径部分):

PS> Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\PowerShellCore\InstalledVersions\*" -Name "SemanticVersion"
7.1.3

只是一个简单的单线。

轮到我了!13年后!

作为Powershell脚本转储其值:

> $majorPsVersion=$PSVersionTable.PSVersion.Major.ToString()> echo "PowerShell v   = ${majorPsVersion}"

将输出:

PowerShell v   = 5