Windows PowerShellで動くスクリプトがPowerShellでも動くとは限らない、なぜなのか?山市良のうぃんどうず日記(279)

Microsoftは2024年2月初め、「回復パーティション」のサイズを拡張するサンプルスクリプトを公開しました。もし、このサンプルスクリプトを実行したい場合は、クロスプラットフォーム対応の「PowerShell 7.x」ではなく、Windowsのコンポーネントである「Windows PowerShell 5.1」の使用をお勧めします。なぜなら、サンプルスクリプト内で使用されている「Split」メソッドの挙動に重大な違いがあるからです。

» 2024年03月12日 05時00分 公開
[山市良(代理)テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

Windowsコンポーネントの「Windows PowerShell」とオープンソースの「PowerShell」

 Windowsのコンポーネントである「Windows PowerShell」は「5.1」が現行バージョンであり、その後のロードマップは示されていません。

 その代わり、Microsoftはオープンソースプロジェクトである「PowerShell」(旧称:PowerShell Core)を提供し、機能強化やパフォーマンス改善を実施してきました。現在の最新バージョンは「7.4.1」です。「PowerShell Core 6」のリリース以降、Windows PowerShellを起動すると、「新しいクロスプラットフォームのPowerShell」を試すように案内されるようになりました(画面1)。ちなみに、「powershell.exe -nologo」を実行すれば、この案内なしでWindows PowerShellを起動できます。

画面1 画面1 Windows PowerShellを起動するたびに、クロスプラットフォームのPowerShellが案内される

 「.NET Framework」上に構築されたWindows PowerShellに対し、PowerShellは「.NET」(旧称、.NET Core)上に構築され、Windows、macOS、Linuxのクロスプラットフォーム対応です。Windows上ではWindows PowerShellとの共存が可能で、既存のWindows PowerShellモジュールとの互換性を提供します。Windows PowerShellに含まれるモジュールやコマンドの一部は、さまざまな理由からPowerShellから削除されていますが、削除されていないモジュールやコマンドを使用する限り、Windows PowerShellで動作するスクリプトはそのままPowerShellでも動くはずです。

Windows PowerShellでは問題ないのにPowerShellではエラー! なぜなのか?

 冒頭で触れたMicrosoft提供のサンプルスクリプトは、2024年1月の「Windows回復環境(Windows RE、WinRE)」更新プログラムのインストールエラー回避策の一つとして示されたものです。

 以下の画面2は、このサンプルスクリプトのコピーを管理者として開いたWindows PowerShell(powershell.exe)とPowerShell(pwsh.exe)でそれぞれ実行した結果です。

画面2 画面2 Microsoft提供のサンプルスクリプトは、Windows PowerShellでは問題なく進むが(奥の青地の画面)、PowerShellではエラーで失敗する(手前の黒地の画面)

 Windows PowerShellでは問題なくスクリプトが進みますが(実際の拡張にはユーザーの指示が必要です)、PowerShellでは「Get-Partiton」コマンドレットがエラーとなり、スクリプトが途中でストップしてしまいます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。