檢查 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时,版本号是不同的。尽管通常情况下,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是一个不好的主意。

通过$host.Version命令检查Powershell版本

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

Referencing $host.Version

這個方法沒什麼特別的。它就是執行Get-Host一樣簡單。

在遠端電腦上顯示$host.Version

你將會看到透過PowerShell Remoting使用$host.Version和執行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\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/