在 PowerShell 中,有无数种方法可以做同样的事情(或接近)。在这篇博文中,您将学习如何检查本地和远程计算机上安装的 PowerShell 版本的每一种方法。我们将涵盖不良的方法和我推荐的方法。
有一些网站显示了检查 PowerShell 版本的各种方法。但没有一个编制了所有这些方法的全面列表。我决定改变这一点。
所有这些方法都应该适用于 Windows PowerShell 和 PowerShell Core。这些方法也应该适用于从 Windows PowerShell 1.0 到 PowerShell 7 的所有版本。
您可以找出正在运行的 PowerShell 版本的方法包括:
-
(Get-Host).Version
属性 -
$host.Version
属性 - 注册表(仅适用于 Windows PowerShell)
-
$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。这看起来像是一个合法的版本。
然而,有时当你在集成终端中运行Get-Host
时,版本可能不一样。尽管通常主机会表示相同版本的引擎,但并不一定总是如此。
通过Get-Host在远程计算机上检查Powershell版本
即使在本地计算机上运行Get-Host
时似乎会返回相同的版本,但在远程计算机上永远不会。
例如,让我们通过Invoke-Command
在远程Windows Server 2016服务器上运行Get-Host
,看看会发生什么。
据我上次检查,不可能在Windows Server 2016上运行PowerShell v1。
依赖Get-Host
是一个完全不好的想法。
检查Powershell版本$host.Version命令
引用$host.Version
是另一种检查Powershell版本的方法。$host
变量是一个自动变量,返回与Get-Host
相同的输出。

$host.Version
这种方法并没有什么特别的。它与运行Get-Host
是一样的。
$host.Version 在远程计算机上
你将会看到与使用$host.Version
或Get-Host
相同的行为。PowerShell 远程也会有同样的行为。
危险,威尔·罗宾逊!
注册表
如果你不想打开 PowerShell 本身,你也可以检查注册表。PowerShell 的版本被放在注册表键路径HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
下的一个值中。这个注册表键有一个名为PowerShellVersion
的值,你可以通过Get-ItemProperty
来引用。
你可以看到这个版本是相似的,但不像其他选项那样包含修订版本。
使用其他工具
使用注册表意味着你完全不需要使用 PowerShell 来找到版本号。你可以从命令提示符或其他可以读取注册表的工具运行命令。
远程计算机上的注册表
注册表是静态的,值在本地或远程都不会改变。你可以确信本地看到的与远程看到的是相同的。
在本地和远程显示相同的版本是好的。但我有一个更好的方法来使用$PSVersionTable
自动变量来展示给你。
通过$PSVersionTable.PSVersion命令检查 PowerShell 版本
最后和最终的方法是引用$PSVersionTable
自动变量上的PSVersion
属性。这种方法将始终表示PowerShell引擎。
$PSVersionTable
自动变量是一个只读哈希表,返回有关PowerShell引擎版本的特定信息。这个自动变量不仅返回版本,还返回PSEdition。此属性可以是Core或Desktop ,以提供有关正在运行的PowerShell版本的进一步信息。

远程计算机上的$PSVersionTable
使用$PSVersionTable
自动变量在本地和远程上都是准确的。您可以看到,通过将$PSVersionTable.PSVersion
包装在脚本块中并在远程计算机上执行该代码,它将返回相同的版本。
摘要
在这篇博客文章中,您已经学会了检查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.
如果我漏掉了任何方法,请在评论中让我知道。我很乐意更新帖子并给予您功劳。