PowerShellのバージョン確認では、エンジンの版、PowerShell Edition、OS、実行ホストを区別します。Windows PowerShell 5.1とPowerShell 7系が同じPCへ共存することもあり、スタートメニューやターミナルの見た目だけでは判断できません。基本は自動変数の$PSVersionTableを使い、スクリプト互換性、モジュール、リモート管理、更新判断へ必要な情報を選んで記録します。本記事では確認方法と実務での応用を解説します。
最も確実な入口は$PSVersionTable
PowerShellを開き、$PSVersionTableを実行します。PSVersionは現在のPowerShellエンジン版、PSEditionはDesktopまたはCore、GitCommitIdはPowerShell 7系の詳細な版、OSとPlatformは実行環境の手掛かりです。表示される項目は版によって異なるため、特定キーが必ずあると決めつけず、必要な値が存在するか確認します。
版だけ必要なら$PSVersionTable.PSVersion、主要版なら$PSVersionTable.PSVersion.Majorを参照できます。出力はSystem.Versionオブジェクトであり、文字列の大小比較をすると「7.10」が「7.9」より小さいと誤判定する可能性があります。互換性判定ではVersion型のまま比較し、最低版を[version]"7.4"のように表します。
Windows PowerShellとPowerShell 7を区別する
Windows PowerShell 5.1はWindowsに含まれるDesktop Editionで、実行ファイルは一般にpowershell.exeです。PowerShell 7系はCore Editionで、pwsh.exeとして別途導入され、両方が共存できます。Windows Terminalのプロファイルを切り替えると同じウィンドウ内でも別エンジンが起動するため、毎回$PSVersionTableで確認します。
PowerShell 7を導入してもWindows PowerShellが自動的に置き換わるわけではありません。古い管理モジュールやアプリが5.1を前提にする一方、新しいクロスプラットフォーム機能や最新版モジュールが7系を求める場合があります。組織ではどちらを標準にするか、例外モジュールをどう扱うか、スクリプトの先頭で必要Editionを確認するかを決めます。
Get-HostのVersionだけに頼らない
Get-Hostまたは$Host.VersionでもVersionが表示されますが、これはPowerShellを提供するホストアプリの情報です。通常のコンソールではエンジン版と同じように見えることが多くても、独自ホストや埋め込み環境では一致しない可能性があります。PowerShellエンジンの互換性判定には$PSVersionTable.PSVersionを使います。
ホストにはConsoleHost、Visual Studio CodeのPowerShell拡張、Windows Terminal内のシェルなどがあります。ターミナルアプリ自体の版とPowerShellの版も別です。「Terminalを更新したからPowerShellも更新された」とは限りません。障害報告にはホスト名、PSVersion、PSEdition、必要ならターミナルや拡張機能の版を分けて記録します。
スクリプトで最低バージョンを宣言する
スクリプトには#requires -Version 7.2のようなrequires文を使用でき、条件を満たさない環境で実行を開始させない設計ができます。必要なモジュールや管理者権限もrequiresで宣言できますが、宣言すれば互換性が自動保証されるわけではありません。実際に利用するコマンド、パラメーター、.NET APIを対象版でテストします。
複数版を支援する場合は、if ($PSVersionTable.PSVersion -ge [version]"7.2")のように分岐できます。ただし版ごとに大きく違う処理を一つのファイルへ詰め込むと保守が難しくなります。共通処理と版固有処理を関数やモジュールへ分け、CIでWindows PowerShell 5.1と対象のPowerShell 7版をテストします。
モジュール互換性をバージョンとセットで確認する
Get-Module -ListAvailableで利用可能なモジュールを確認し、Get-Module モジュール名 -ListAvailable | Select Name,Version,Pathで版と配置先を記録します。同じ名前の複数版が共存すると、読み込まれる版が端末ごとに違うことがあります。PowerShellGet、PSResourceGet、モジュール自体の版はエンジン版とは別です。
Windows PowerShell専用のモジュールをPowerShell 7から互換機能で呼べる場合もありますが、すべてのコマンドやオブジェクトが同じ動作になるとは限りません。利用製品の公式サポート表を確認し、重要な変更処理は検証環境で実行します。モジュールを最新版へ上げる前に依存スクリプトを棚卸しし、既存版を無断で削除しません。
リモート接続では接続先の版を確認する
PowerShell Remotingでは、ローカル端末と接続先でエンジン版が異なる場合があります。Invoke-Command -ComputerName Server01 -ScriptBlock { $PSVersionTable }のように接続先で評価し、返された値を確認します。資格情報をコードへ平文で書かず、組織の認証方式と最小権限を使います。
暗黙的リモートやCIMセッションでは、コマンドがどちら側で実行されるかを明確にします。ローカルで版条件を満たしても、接続先モジュールが古い、エンドポイントがWindows PowerShellを使う、LanguageModeが制限されることがあります。端末ごとの成功・失敗を別に記録し、取得失敗を古い版と誤判定しません。
アプリや自動化基盤が使うPowerShellを特定する
タスクスケジューラー、CI/CD、RPA、監視製品、バックアップ製品は、PATHの先頭や実行ファイルの完全パスにより別のPowerShellを起動します。対話画面で7系を確認しても、タスクがpowershell.exeを指定していれば5.1で動きます。タスクのProgram、引数、作業フォルダー、実行アカウントを確認します。
自動化ではpwsh.exeまたはpowershell.exeの完全パスを明示し、対象版を構成管理します。Microsoft Store、MSI、winget、ZIPなど導入方法で更新方式やパスが異なります。アップグレード後に古い版のフォルダーが残ることもあるため、実行中プロセスのPathと$PSVersionTableをログへ残すと追跡しやすくなります。
更新判断とサポート状態を確認する
PowerShell 7にはLTSとStableのリリースがあり、サポート期間と更新頻度が異なります。現在版を確認したら、Microsoftのライフサイクルとリリース情報でサポート状態を確認します。記事やスクリプトへ固定した「最新版」を永久に残さず、判定日と参照先を記録します。Windows PowerShell 5.1はWindowsの一部として扱われます。
更新では新機能だけでなく、破壊的変更、.NET版、モジュール互換性、実行ポリシー、プロファイル、文字コード、TLS、リモートエンドポイントを確認します。全端末一斉更新前に代表スクリプトをテストし、ロールバック方法を用意します。版の不一致を解消するために実行ポリシーやセキュリティ制御を弱めることは避けます。
実務での確認チェックリスト
- $PSVersionTableでPSVersionとPSEditionを確認する
- Get-HostのVersionをエンジン版と混同しない
- Windows PowerShell 5.1とPowerShell 7の共存を確認する
- Version型で比較し文字列比較を避ける
- モジュール、ホスト、自動化実行ファイルの版を別々に記録する
- 更新前に公式サポート状態とスクリプト互換性を確認する

コメント