检查 PowerShell 版本:最佳实践

在 PowerShell 中,有无数种方法可以做同样的事情(或接近)。在这篇博文中,您将学习如何检查本地和远程计算机上安装的 PowerShell 版本的每一种方法。我们将涵盖不良的方法和我推荐的方法。

有一些网站显示了检查 PowerShell 版本的各种方法。但没有一个编制了所有这些方法的全面列表。我决定改变这一点。

所有这些方法都应该适用于 Windows PowerShell 和 PowerShell Core。这些方法也应该适用于从 Windows PowerShell 1.0 到 PowerShell 7 的所有版本。

您可以找出正在运行的 PowerShell 版本的方法包括:

  1. (Get-Host).Version 属性
  2. $host.Version 属性
  3. 注册表(仅适用于 Windows PowerShell)
  4. $PSVersionTable.PSVersion 属性

让我们从最不推荐的方法到最推荐的方法分解所有查找 PowerShell 版本的方法。

Get-Host

PowerShell 有一个称为主机的概念。主机是托管 PowerShell 引擎的程序。它不是 PowerShell 引擎本身。PowerShell 控制台或带有集成终端的代码编辑器都是 PowerShell 主机。

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

如果你运行(Get-Host).Version,你会看到返回一个看起来像是PowerShell引擎版本的版本号。外表有时是会欺骗人的。

下面我在Windows PowerShell 5.1上运行了Get-Host,你可以看到它返回的是5.1.17134.858。这看起来像是一个合法的版本。

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

然而,有时当你在集成终端中运行Get-Host时,版本可能不一样。尽管通常主机会表示相同版本的引擎,但并不一定总是如此。

通过Get-Host在远程计算机上检查Powershell版本

即使在本地计算机上运行Get-Host时似乎会返回相同的版本,但在远程计算机上永远不会。

例如,让我们通过Invoke-Command在远程Windows Server 2016服务器上运行Get-Host,看看会发生什么。

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

据我上次检查,不可能在Windows Server 2016上运行PowerShell v1。

依赖Get-Host是一个完全不好的想法。

检查Powershell版本$host.Version命令

引用$host.Version是另一种检查Powershell版本的方法。$host变量是一个自动变量,返回与Get-Host相同的输出。

Referencing $host.Version

这种方法并没有什么特别的。它与运行Get-Host是一样的。

$host.Version 在远程计算机上

你将会看到与使用$host.VersionGet-Host相同的行为。PowerShell 远程也会有同样的行为。

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

危险,威尔·罗宾逊!

注册表

如果你不想打开 PowerShell 本身,你也可以检查注册表。PowerShell 的版本被放在注册表键路径HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine下的一个值中。这个注册表键有一个名为PowerShellVersion的值,你可以通过Get-ItemProperty来引用。

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

你可以看到这个版本是相似的,但不像其他选项那样包含修订版本。

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

使用其他工具

使用注册表意味着你完全不需要使用 PowerShell 来找到版本号。你可以从命令提示符或其他可以读取注册表的工具运行命令。

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

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

远程计算机上的注册表

注册表是静态的,值在本地或远程都不会改变。你可以确信本地看到的与远程看到的是相同的。

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

在本地和远程显示相同的版本是好的。但我有一个更好的方法来使用$PSVersionTable自动变量来展示给你。

通过$PSVersionTable.PSVersion命令检查 PowerShell 版本

最后和最终的方法是引用$PSVersionTable自动变量上的PSVersion属性。这种方法将始终表示PowerShell引擎。

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

$PSVersionTable自动变量是一个只读哈希表,返回有关PowerShell引擎版本的特定信息。这个自动变量不仅返回版本,还返回PSEdition。此属性可以是CoreDesktop ,以提供有关正在运行的PowerShell版本的进一步信息。

$PSVersionTable output

远程计算机上的$PSVersionTable

使用$PSVersionTable自动变量在本地和远程上都是准确的。您可以看到,通过将$PSVersionTable.PSVersion包装在脚本块中并在远程计算机上执行该代码,它将返回相同的版本。

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

摘要

在这篇博客文章中,您已经学会了检查PowerShell版本的所有方法,无论是在本地还是在远程。我希望前几种方法给了您一个关于哪些方法要检查版本的想法!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

如果我漏掉了任何方法,请在评论中让我知道。我很乐意更新帖子并给予您功劳。

Source:
https://adamtheautomator.com/powershell-version/