确定已安装的PowerShell版本

时间:2009-12-01 11:30:03

标签: powershell

如何确定计算机上安装的PowerShell版本,以及确实安装的是什么版本?

22 个答案:

答案 0 :(得分:3232)

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

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

PS C:\> $PSVersionTable.PSVersion

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

答案 1 :(得分:411)

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

答案 2 :(得分:92)

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

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

,如果存在,则值是否为1(已安装),详见博客文章 Check if PowerShell installed and version

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

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

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

要确定从.ps1脚本安装的PowerShell版本,您可以使用以下单行内容,详见PowerShell.com Which PowerShell Version Am I Running

$isV2 = test-path variable:\psversiontable

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

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

答案 3 :(得分:92)

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

答案 4 :(得分:36)

只想在这里加2美分。

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

powershell -Command "$PSVersionTable.PSVersion"

修改

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

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

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

image

答案 5 :(得分:27)

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

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

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

    Version
    -------
    3.0
    

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

答案 6 :(得分:19)

Microsoft's recommended forward compatible method for checking if PowerShell is installed and determining the installed version是查看两个特定的注册表项。我已经在这里重现了细节,以防链接中断。

根据链接页面:

  

取决于任何其他注册表项或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>

答案 7 :(得分:11)

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

  • 运行命令提示符(开始,运行,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

答案 8 :(得分:9)

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

引擎版本包含在$psversiontable.psversion中。对于PowerShell 1.0,这个变量不存在,所以很明显,如果这个变量不可用,那么显然假设引擎是1.0是完全安全的。

答案 9 :(得分:9)

使用:

__block BOOL isPhotoInICloud = NO;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){

    isPhotoInICloud = YES;
    // some code to update the download progress
});
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.synchronous = NO;

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// use the options to get the high quality image for only once time.
});

您可以从 How to determine installed PowerShell version 下载详细脚本。

答案 10 :(得分: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

来源:this website

答案 11 :(得分:6)

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

  

测试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

答案 12 :(得分:6)

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

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

无需记住每个变量。只需Get-Variable即可(以及“应该有关于版本的内容”)。

答案 13 :(得分:4)

PowerShell 7

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

Microsoft 的 documentation 声明在安装 PowerShell 7 时会创建额外的注册表项:

<块引用>

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

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

在我的电脑上显示如下:

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

Image displaying the specified key in the Windows Registry Editor

可以看到,我电脑上安装的PowerShell 7版本是7.1.3。如果目标计算机上安装 PowerShell 7,则整个密钥不应该存在。

如 Microsoft 文档中所述,注册表路径会因安装的 PowerShell 版本而略有不同。

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

用于查询此注册表值中数据的 PowerShell cmdlet 是 Get-ItemPropertyValue cmdlet。观察它的使用和输出如下(注意星号 wildcard 字符用来代替可能改变的关键路径部分):

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

7.1.3

只是一个简单的单线。

答案 14 :(得分:3)

以下cmdlet将返回PowerShell版本。

$PSVersionTable.PSVersion.Major

答案 15 :(得分:3)

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

这是我的解决方案:

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

答案 16 :(得分:1)

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

答案 17 :(得分:0)

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

Get-Host | select {$_.Version}

答案 18 :(得分:0)

我制作了一个小的批处理脚本,可以确定PowerShell版本:

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

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

找到带有版本的行后,它将使用for命令提取版本。在这种情况下,我们说分隔符是一个冒号,然后在第一个冒号后面搜索,导致我的情况5.1.18362.752

答案 19 :(得分:-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
)

答案 20 :(得分:-1)

我在 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

答案 21 :(得分:-3)

这里有很多答案。我以为我会在这里,因为它比许多答案要短得多。

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