かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.196 Windows PowerShellとPowerShell(pwsh)|セイテク・シス管道場(Web)
2026年04月20日配信
執筆者:山内 和朗
「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当てたいと思います。今回は、Windows ServerやWindowsに搭載されている2つのPowerShellの話です。サポート期間中のWindows ServerおよびWindowsには、Windows PowerShell 5.1が標準搭載されています。Windows 11バージョン24H2以降には、Windows PowerShell 5.1に加えて、PowerShell 7.x(旧称、PowerShell Core)が標準搭載されるようになりました。これら2つの違い、分かりますか?
現在、PowerShellには、Windows PowerShell 5.1とPowerShell 7.x(旧称、PowerShell Core)の2つの種類があり、これらは別製品です。
Windows PowerShell 5.1は、.NET Framework 4.5上の構築されたコマンドシェルであり、Windows ServerやWindowsの管理や設定、カスタムシェルスクリプトの実行に利用されます。最新のWindows PowerShell 5.1はWindows Server 2016およびWindows 10バージョン1607にWindowsコンポーネントの一部として初めて搭載され、以降のWindows ServerおよびWindowsバージョンにもこのバージョンが標準搭載されています。そして、Windows PowerShell 5.1は最後のバージョンであり、登場して以降、新機能は追加されていません。いわゆるメンテナンスモードにあるWindowsコンポーネントであり、新しいマイナー、メジャーバージョンが提供されることはありません。つまり、Windows PowerShell 5.2や6.0がリリースされることはありません。Windowsコンポーネントの一部であるため、Windows PowerShell 5.1を含むWindowsバージョンのサポートが終了するまで、サポートは継続されます。
もう1つのPowerShell(旧称、PowerShell Core)は、.NET(旧称、.NET Core)上に構築されたオープンソースプロジェクトであり、Windowsだけでなく、LinuxやmacOSでも動作するクロスプラットフォームのコマンドシェルです。PowerShellの新しいリリースは、新しいバージョンの.NET(旧称、.NET Core)上に構築されています。PowerShell 6.0は.NET Core 2.0上に構築されていますが、最新の安定版であるPowerShell 7.5は.NET 9.0上に構築されています。
現在、サポートされているWindows ServerやWindowsには、.NET Framework 4.8または4.8.1が搭載されていますが、Windows PowerShell 5.1は.NET Framework 4.5上に構築されています。このことからも、Windows PowerShell 5.1がメンテナンスモードにあることが分かるでしょう。.NET Frameworkについても、新しいメジャーバージョン(例えば4.9)は計画されていません。Microsoftは開発プラットフォームの主軸を、.NET Frameworkから.NETへ切り替えており、PowerShellの進化も.NET上のPowerShell(以下、PowerShell(pwsh ))に対して行われることになります。
数年前からWindoows 10/11やWindows Server 2022以降では、Windows PowerShell 5.1を起動すると、次のようなメッセージが表示されるようになり、最新のPowerShell(pwsh) をインストールするように案内されるようになりました(画面1)。Ctrlを押しながらURLリンクをクリックすると、「Windows PowerShellの更新メッセージに関するFAQ」ページが開き、そのページにある「WindowsにPowerShellをインストールする」リンクから、インストール方法を知ることができます。
新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows

画面1 Windows PowerShell 5.1のウィンドウを開くと、PowerShell(pwsh) をインストールするように案内される。PowerShell 7.xインストールしてもこのメッセージは消えない(リンク先のFAQページにはメッセージを無効にする方法はないと書いてある)
前出したように、Windows PowerShell 5.1はもはや開発が行われていないメンテナンスモードにあります。そして、上記の消せないメッセージにあるように、Microsoftは最新のPowerShell(pwsh) のインストールを勧めています。ただし、最新のPowerShell(pwsh) のインストールは必須ではありません。最新のPowerShell(pwsh) で提供される新機能を利用したいといった特定の要件がない限り、インストールは不要です。例えば、オンプレミスのWindows ServerをPowerShellで管理するためには、Windows PowerShell 5.1で十分です。最新のPowerShell(pwsh) は、Windows PowerShell 5.1の機能を完全に置き換えるものではありません。Windows Server向けの管理モジュールの中には、BestPracticesモジュールのコマンドレットなど、Windows PowerShell 5.1でなければ動かないものもあります(画面2)。

画面2 ベストプラクティスアナライザーのモジュール(BestPractices)のコマンドレットは、Windows PowerShell 5.1では動作するが(画面下)、PowerShell 7.xでは動作しない(画面上)例の1つ
Windows PowerShell 5.1はWindows ServerやWindowsに標準搭載されているため、インストールの有無を確認しなくても、確実に利用できるという利点もあります。例えば、弊社製品「BOM for Windows Ver.8.0」の「カスタム監視」で、実行するプログラムとして「powershell.exe」とその引数(例、-ExecutionPolicy Bypass -File "スクリプトのパス.ps1"や-Command "& { スクリプトブロック }")を指定できます。「powershell.exe」のインストールの有無を確認する必要はありません。
Windows PowerShell 5.1はWindowsコンポーネントの一部であるため、セキュリティ更新をWindowsと別に考慮する必要もありません。なお、PowerShell(pwsh) は、PowerShell 7.2以降、Windows Update(Microsoft Updateへのオプトインが必要)経由で更新できるようになりました。
Windows PowerShell 5.1とPowerShell(pwsh) の両方がインストールされている場合、どちらの現在、どちらのコマンドシェルを実行しているのかを確認する方法はいくつかあります。最も簡単なのはウィンドウ左上のアイコンの違いです。Windows PowerShell 5.1は多い背景のコマンドシェルの
アイコン、PowerShell(pwsh) は黒い背景のコマンドシェルの
アイコンです。先ほどの“新機能と改善のために最新のPowerShell...」のメッセージがウィンドウに残っているなら、それだけでWindows PowerShell 5.1だと分かります。
コマンドシェル内で次のいずれかのコマンドを実行して調べることもできます。$PsVersionTableのPSVersionでバージョン(5.1.x、7.x.x)を知ることができますし、PSEditionが「Desktop(Windows PowerShell 5.1の場合)」であるか「Core(PowerShell(pwsh) の場合)」で識別することができます。2つ目のコマンドラインは、現在のコマンドシェルを実行しているプロセスのファイル名を取得するもので、「powershell.exe(Windows PowerShell 5.1の場合)」または「pwsh.exe(PowerShell(pwsh) の場合)」で識別できます(画面3)。
| $PSVersionTable (Get-Process -Id $PID).Path |

画面3 Windows PowerShell 5.1とPowerShell(pwsh) を識別する複数の方法
汎用スクリプトの作成には、最新のPowerShell(pwsh) をお勧めします。なぜなら、Windows PowerShell 5.1は多少曖昧というか寛容な部分があり、不適切なコードでも何となく動作することがありました。最新のPowerShellは(pwsh) ルールに厳格であり、スクリプト作成に向いています。例えば、PowerShellの-Splitオペレーター(演算子)は正規表現(regex)で文字列を分割しますが、.Splitメソッドは文字で文字列を分割します。正規表現では¥は¥¥のようにエスケープしてあげなければなりませんが、文字として認識されるメソッドでは¥を指定できます。しかし、画面4を見てください。これは、.NET Frameworkの.Splitメソッドと.NETの.Splitメソッドの挙動の違いを示しています。.NETの.Splitメソッドは正規表現を受け付けませんが(正しい挙動)、.NET Frameworkはそれを受け付けます(曖昧な挙動)。Windows PowerShell 5.1環境で作成されたスクリプトには、こういったコードの間違いが入り込む余地があります。Windows PowerShell 5.1ではうまく動いても、PowerShell(pwsh) では期待通りに動かないということが出でくるのです。3年前に私が書いた以下の記事では、Microsoftが提示したPowerShellスクリプトに、.Splitメソッドの誤った記述が含まれており、PowerShell(pwsh)ではエラーになることを紹介しました。問題のスクリプトはその後も訂正されていません。
Windows PowerShellで動くスクリプトがPowerShellでも動くとは限らない、なぜなのか?|山市良のうぃんどうず日記@IT(2024年03月12日)
画面4 Windows PowerShell 5.1とPowerShell(pwsh) での.Splitメソッドの違い
Microsoftのクラウドが関わる操作、例えば、Azure PowerShellや、Azure REST API、Microsoft Graph REST APIを使用する場合は、PowerShell(pwsh)が推奨されています。Invoke-RestMethodやInvoke-WebRequest、ConvertTo-Jsonなど、最新の.NETベースで機能強化されています(HTTP 2.0やTLS 1.3対応、ConvertTo-Jsonのシリアル化や性能の改善など)。Exchange OnlineやSharePoint OnlineもPowerShell(pwsh) に対応または推奨になっています。 また、クロスプラットフォームで利用するなら、PowerShell(pwsh) でそろえておくことで、無用なトラブルを回避できるでしょう。ちなみに、Azure CloudShellのAzure PowerShellは、LinuxのPowerShell(pwsh)上で動いています(画面5)。
PowerShellの新機能|PowerShell(Microsoft Learn)

画面5 Azure CloudShellのAzure PowerShellは、Linux用のPowerShell 7.xで動いている
昨年末、Windows PowerShell 5.1には、IEコンポーネントのセキュリティ問題を理由とした変更が標準的なコマンドレットに加えられました。それは、Invoke-WebRequestコマンドレットでの-UseBasicParsingパラメーターの必須化です。この変更は、既存のスクリプトに影響する場合があります。PowerShell(pwsh) のInvoke-WebRequestはIEコンポーネントに依存しておらず、-UseBasicParsingパラメーターはそもそも不要です(このパラメーターは下位互換性のために残されているだけで、操作には何も影響しません)。
ITニュース. Windows PowerShell 5.1のInvoke-WebRequestに追加された警告について(2025年12月12日配信)
Windows PowerShell 5.1では新機能の追加はなくても、この例のようにセキュリティ問題を理由に今後も仕様が変更される可能性があります。これもまた、汎用スクリプト向けにPowerShell(pwsh) をお勧めする理由の1つです。
参考:
Windows PowerShell 5.1 と PowerShell 7.x の相違点|PowerShell(Microsoft Learn)
ライフサイクルに関する FAQ - .NET Framework|Lifecycle(Microsoft Learn)
セイテク・シス管道場(Web) (1) |(2)|(3)|(4)