【Get-Host/$PSVersiontable】PowerShellのバージョンを確認する方法とは?

こんにちは。チェシャ男です。(-皿-)

今回は、

PowerShell のバージョン確認方法】

について紹介します。

個人的に Powreshell を使う場合だと、バージョンの事をそんなに気に留める必要はないと思います。 (※あくまで個人的な感想です)

一方、お仕事でスクリプトを組まなければならなくなった場合は、しっかりとバージョンを意識しなければなりません。コマンドレットの互換性がなかったりしたら大変ですからね。

作成したツールの稼働先が Windows 2012 R2で、あなたが使っている PC が Windows 7の場合。果たしてバージョンは同じなのか!

そんな時にバージョン調査に使える、バージョン取得方法を2通りご紹介します。

Get-Host でバージョン取得

実行している PowerShell のバージョンを取得できるコマンドレットに、

Get-Host

というものがあります。

[blogcard url=”https://cheshire-wara.com/powershell/ps-help/get-host-help/”]

【コマンドレット】

Get-Host

【オプション】

なし

【入力】

None(このコマンドレットに対して、パイプ渡しはできません)

【出力】

System.Management.Automation.Host.PSHost

【エイリアス】

なし

Get-Hostの実行

実行結果を見てみましょう。

PS C:\> Get-Host

Name             : ConsoleHost
Version          : 5.0.10586.117
InstanceId       : 912edb2e-f4da-4cab-9604-020a8ad657bb
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

結果が何行か出力されますが、バージョン情報について知りたい方は

「Version    : 5.0.10586.117」

と表示されている部分を見てみてください。

バージョンのプロパティを取り出す

実行結果を見てみても、”.(ドット)”で区切られていてよくわからないかもしれません。

そんな場合は、バージョン部分のプロパティを取り出してみましょう。

“.”を使ってプロパティを参照することができます。実行結果は下をご覧ください。

PS C:\> (Get-Host).Version

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

PS C:\> (Get-Host).Version.Major
5

最終的に、”Major” のプロパティまで抽出していますが、この値が一般的にいうところの「PowerShell のバージョン」です。

まあ、つまりチェシャ男が実行している Powerhsell はバージョン 5.0ということになりますね。

自動変数$host

Get-Host コマンドレットの戻り値を格納している、

$host

という変数が存在していますので、この変数を用いることでも同様の結果を得られます。

PS C:\> $host


Name             : ConsoleHost
Version          : 5.0.10586.117
InstanceId       : 912edb2e-f4da-4cab-9604-020a8ad657bb
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Get-Host の落とし穴

さて、ここまで紹介してきたGet-Hostコマンドレットですが、注意するべき落とし穴があります。

Get-Host コマンドで取得できる結果は、PowerShell を実行しているホストプログラムに関する情報なのです。

たとえば、

PowerShell ISE 上で Get-Host コマンドを実行した場合の結果を見てましょう。

PS C:\> Get-Host | Select-object Name,Version

Name             : Windows PowerShell ISE Host
Version          : 5.0.10586.117

Name を見て頂くと、実行するホストが変わっていることが変わっていることがわかりますよね。

Powrshell ISE は Windows 標準装備の公式ツールなので、この場合特に問題はありません。

しかし、

PowerCLI 上等の外部ツール上で動作させた場合、うまく値を取得できない場合がありますのでご注意ください。

$PSversionTableでバージョン取得

PowerShell のバージョンを取得できる、

$PSVersionTable

という変数があります。

$PSVersionTableの実行

実行結果を見てみましょう

PS C:\> $PSVersiontable

Name                           Value
----                           -----
PSVersion                      5.0.10586.117
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.117
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

結果だけ見てみると、Get-Host コマンドレットの結果とほぼ変わらないようです。

「PSVersion       5.0.10586.117」

と、表示されていますね。

バージョンのプロパティを取り出す Part2

“.”を使ってプロパティをすることができます。

$PSVershionTable で参照するプロパティは、”PSVersion” です。

PS C:\> $PSVersiontable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

この様に、Get-Host 時の結果と同じ結果を得ることができました。

CLR のバージョンを取得

ここまで読んでくれたあなたは、

Get-Host $PSVersionTable の違いはなんだろう。」

と、思っているかもしれません。

$PSVersionTable には、.Net Framework の CLR(共通言語ランタイム)のバージョンに関するプロパティが含まれており、”.” を使って取得することができます。(→ CLRとPowerShellの関係)

PS C:\> $PSVersiontable.CLRVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  42000

これにより、PowerShell が動作する CLR を取得することができます。

$PSVersionTable の落とし穴

Get-Host の落とし穴では、Get-Host では動作するホスト情報の影響を受けると記載しました。そのため、Microsoft の “Hey,Scripting Guy!” でも、$PSVersionTable によるバージョン取得を推奨しています。

ただし、$PSVersionTable にも落とし穴があります。

Windows PowerShell 1.0 には、$PSVersionTable のシェル変数が定義されていません。

もしあなたが、(ほとんどないとは思いますが) PowerShell 1.0 を使っている場合は、$PSVersionTable によってバージョンを取得することができないことに注意してください。

まとめ

PowerShell でバージョン情報を取得するお勧めの方法は

$PSVersionTable

の変数から、PSVersion プロパティを引っ張ってくること。

もし、変数の定義がない場合は、バージョン 1.0である。

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。