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プロパティ

これらの方法を最も推奨される方法から最も推奨されない方法まで解説しましょう。

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に頼るのはどんな状況でも良いアイデアではありません。

$host.VersionコマンドでPowerShellのバージョンを確認する

$host.Versionを参照することは、PowerShellのバージョンを確認する別の方法です。$host変数は、Get-Hostと同じ出力を返します。

Referencing $host.Version

この方法には特別なものはありません。単にGet-Hostを実行するのと同じです。

リモートコンピュータ上で$host.Versionを実行すると、

PowerShellリモーティングを介して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も返します。このプロパティは、実行中のPowerShellのエディションに関する詳細情報を提供するため、CoreまたはDesktop のいずれかになります。

$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/