Determine installed PowerShell version
如何确定计算机上安装的PowerShell版本,以及是否安装了它?
使用
请注意,
仅主机版本,而不是引擎。 PowerGUI的,
PowerShellPLUS等都是托管应用程序,和
他们将设置主机的版本以反映他们的产品
版本完全正确,但不是你想要的。
1 2 3 4 5 | PS C:\> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 4 0 -1 -1 |
我会使用Get-Host或$ PSVersionTable。正如Andy Schneider所指出的,
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 |
您可以查看内置变量
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上都运行得很完美。
您可以通过完成以下检查来验证是否已安装Windows PowerShell版本:
在Windows PowerShell控制台中,在命令提示符处键入以下命令,然后按Enter:
1 | Get-Host | Select-Object Version |
您将看到如下所示的输出:
1 2 3 | Version ------- 3.0 |
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 然后点击返回。然后,您应该获得PowerShellPS 提示符:
1 2 3 4 5 6 | C:\Users\MyUser>powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\MyUser> |
然后,您可以通过键入
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> |
如果要返回到命令提示符,请键入
要运行脚本,请访问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版本下载详细脚本。
引擎版本包含在
要检查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 |
忘记这个页面并且永远不会回到它的最简单的方法是学习
没有必要记住每个变量。只需
以下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"命令。它应该给你
这是"批处理文件获取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 |
这里有很多答案。我以为我会把我放在这里,因为它很短,并说主要和次要版本在一起。
1 | $psMajorVer = $PSVersionTable.PSVersion.Major.ToString();$psMinorVer = $PSVersionTable.PSVersion.Minor.ToString();Write-Host"You have Powershell version" -NoNewline; Write-Host ($psMajorVer +"." + $psMinorVer); |