当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 检查 PowerShell 版本的 4 种方法(好与坏)

作者:精品下载站 日期:2024-12-14 20:49:42 浏览:13 分类:玩电脑

检查 PowerShell 版本的 4 种方法(好与坏)


在 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 版本的所有方法。

获取主机

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

主机可以有一个完全独立于PowerShell本身的版本这可能会欺骗许多新手。让我告诉你原因。

如果运行 (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 相同的输出。

这个方法没有什么特别的。它与运行 Get-Host 完全相同。

远程计算机上的 $host.Version

您将通过使用 $host.Version 的 PowerShell Remoting 看到与运行 Get-Host 相同的行为。

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\PowerShellEngine 的值下。此注册表项有一个名为 PowerShellVersion 的值,您可以使用 Get-ItemProperty 引用该值。

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

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

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

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

使用其他工具

使用注册表还意味着您根本不需要使用 PowerShell 来查找版本。您可以从命令提示符或其他可以读取注册表的工具运行命令。

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

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

远程计算机上的注册表

注册表是静态的,值不会在本地或远程更改。您可以确信,您在本地看到的内容将与您在远程看到的内容相同。

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\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。此属性可以是“Core”或“Desktop”,以提供有关正在运行的 PowerShell 版本的更多信息。

远程计算机上的 $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 版本的所有方法。我希望前几种方法能让您了解哪些方式检查版本!

我建议始终使用 $PSVersionTable.PSVersion。所有其他方法可能看起来与 PowerShell 引擎版本类似,但可能并不总是反映引擎版本。

如果我错过了任何方式,请在评论中告诉我。我很高兴更新这篇文章并给予您信任。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯