PowerShell 7.2がリリースされました

2021.11.09

しばたです。

本日.NET 6の正式リリースと足並みを揃える形でPowerShell 7.2がリリースされました。

PowerShell Teamからのアナウンスは以下となります。

本記事では上記アナウンスの内容を中心にPowerShell 7.2について解説します。

PowerShell 7.2 の入手方法、更新方法

PowerShell 7.2の入手方法やアップデート方法はPowerShell 7 - 7.1の時と基本的に同じです。
GitHubリポジトリおよび各種パッケージマネージャからインストール可能です。
詳細な手順はGitHubにある手順をご覧ください。

更新点

PowerShell 7.1のリリース時はStable版のバイナリがMicrosoft Storeから入手可能になりましたが、今回はMSIインストーラー版のバイナリにおいてMicrosoft Updateによる更新がサポートされる様になりました。

以前書いたこちらの記事の内容がStable版にも反映された形となります。

この設定はMSIインストーラーの以下の画面から設定できる様になっておりデフォルトで有効にする様になっています。

  • Enable updateting PowerShell through Microsoft Update or WSUS
    • → Microsoft Update経由でPowerShellを更新する設定
  • Use Microsoft Update when I check for updates
    • → Windows Update時にMicrosoft Updateも行う(他のMicrosoft製品の更新プログラムを受け取る)様にする設定

ちなみにですが、この設定を実際に確認できるのは 次のリリース になりますのでPowerShell 7.2.1までお待ちください。
(加えてPreview版の更新設定は PowerShell 7.3-preview.1 の時に反映される)

PowerShell 7.2 新機能

PowerShell 7.1の時と同様で新機能はそれほど多くありません。
詳細は以下のDocsをご覧ください。

今回は先述のアナウンスおよびこのWhat's newからいくつかピックアップして紹介しようと思います。

ANSIエスケープシーケンスサポートの強化

PowerShell 7.2ではANSIエスケープシーケンスのサポートが強化され、各種コマンドの実行結果表示(Table ViewやList View)が色付き表示になっています。

そして新たに$PSStyleという組み込み変数が追加され各種表示設定をカスタマイズすることも可能となっています。

試験的な機能の昇格

PowerShell 7.2では以下の試験的な機能が本機能として取り込まれました。

1. Microsoft.PowerShell.Utility.PSImportPSDataFileSkipLimitCheck

Import-PowerShellDataFileコマンドに-SkipLimitCheckパラメーターが追加されました。

2. Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace

Debug-Runspaceコマンドに-BreakAllパラメーターが追加されました。

3. PSAnsiRendering

前項の$PSStyleの導入です。

4. PSAnsiProgress

プログレスバーが従来のものとは異なる最小限の表示に変わりました。

(簡単なコマンドでの表示例)

従来の表示に戻すには以下の様に$PSStyleを変更します。

$PSStyle.Progress.View = 'classic'

5. PSCultureInvariantReplaceOperator

-replace演算子の文字列比較がカルチャに依存しない形に変更されました。

発端のIssueはこちらで、たとえばフランスのカルチャ設定下だと1.2 -replace ','といった置換が意図したものにならない問題を改善しています。

6. PSNotApplyErrorActionToStderr

ネイティブコマンド(外部コマンド)がstderrに出力する場合はErrorActionを発生させない様に変更されました。
これはstderrをエラー以外の用途で使うネイティブコマンドがそれなりに存在するため現実に合わせた変更となっています。

7. PSUnixFileStat

非Windows OSにおいてGet-ChildItemの結果表示をよりOSに適した形(ls -alに近い形)に改善されています。
下図を見てもらうのが手っ取り早いでしょう。

廃止された試験的な機能

今回Implict Remotingのパフォーマンス改善となるPSImplicitRemotingBatchingが正式に廃止となりました。
こちらはシンプルにImplicit Remoting自体がさほど使われていない現状を踏まえての判断となります。

追加された試験的な機能

PowerShell 7.2では以下の試験的な機能が追加されています。
デフォルトでは無効となってますので気になる方は適宜有効にしてください。

1. PSNativeCommandArgumentPassing

この機能ではネイティブコマンドに渡される引数の解析方法を新しくします。
非常に説明の難しい機能なので詳細は以下のドキュメントを参照してください。

2. PSAnsiRenderingFileInfo

$PSStyleに含まれる以下のプロパティを有効にします。

  • $PSStyle.FileInfo.Directory : ディレクトリ情報の表示スタイル
  • $PSStyle.FileInfo.SymbolicLink : シンボリックリンクの表示スタイル
  • $PSStyle.FileInfo.Executable : 実行可能ファイルの表示スタイル
  • $PSStyle.FileInfo.Extension : 表示色を変えるファイル拡張子

機能を有効にすると以下の様な表示が可能となります。

3. PSLoadAssemblyFromNativeCode

ネイティブコード(非.NETプログラム)からPowerShellのアセンブリをロードするためのAPI(LoadAssemblyFromNativeMemory)を有効にします。
このAPIは例えばC++やRustのプログラムでPowerShellをホストするといったケースで使います。

PowerShell DSCが別モジュールに分離されました

こちらは破壊的変更となります。
これまでPowerShell DSCの機能を実現する組み込みモジュールであったPSDesiredStateConfigurationがPowerShell本体から分離されました。

PowerShell 7.2以降でDSCの機能を使いたい場合は以下の様にInstall-Moduleコマンドを実行してください。

Install-Module -Name PSDesiredStateConfiguration -Repository PSGallery -MaximumVersion 2.99

この変更に至る経緯については以下のブログにありますのでご一読ください。

かいつまんで説明すると従来のPowerShell DSC(内部的にVer.2とされている)からクロスプラットフォーム向けに再実装するPowerShell DSC v3に向けた変更となります。
残念ながらPowerShell DSC v3がいつ頃リリースされるのかについては明言されていません。

PSReadLine 2.1

PowerShell 7.2にはPSReadLine 2.1が標準で組み込まれています。
PSReadLine 2.1の詳細については以下の記事をご覧ください。

追記 : PSReadLine 2.2 のベータ版をお使いの方へ

本日時点でPSReadLineはVer.2.2-beta.4が最新となっています。
ベータ版のPSReadLine 2.2をお使いの方でPowerShell 7.2にPowerShellをアップデートする場合は必ずPSReadLine 2.2-beta.3より新しいバージョンにしてください。
それ以前のベータ版だとエラーとなります。

PSReadLineのGitHubリポジトリに同様のIssueがあまりにも多く起票されるので本記事でも追記しておきます。

.NET 6化と対応プラットフォーム

PowerShell 7.2はその実行基盤が.NET 6になっています。
.NET 6は長期サポートであるLTSリリースであるためPowerShell 7.2もLTSリリースとなります。

本日時点での各バージョン毎のサポート期限は以下の通りです。

バージョン サポートポリシー EOL
7.2 LTS (Current) 2024年11月 (.NET 6のEOLまで)
7.1 Non LTS 2022年5月31日
7.0 LTS 2022年12月3日
6.x Non LTS サポート切れ

LTSリリースなので皆さんも安心してガンガンバージョンアップすると良いと思います。

対応プラットフォーム

対応プラットフォームは明記されている分で以下となります。

  • Windows 10 (Ver.1607以降)、Windows 11
  • Windows Server 2012 R2 - 2022
  • macOS Mojave (10.14) 以降
    • macOS Big Sur (11.5) についてはArm64版もサポート対象
  • CentOS, RHEL 7 - 8
    • Fedoraについては記載なし
  • Debian 10
  • Ubuntu 18.04, 20.04

.NET 6がサポートするOSに準じつつも若干新しめのバージョンを要求する様になっています。

最後に

以上となります。

目立った新機能こそ無いものの.NETの進化に合わせて着実に機能改善を積み重ねている印象を受けます。

あとは当初の目的であるWindows PowerShellの置き換えに到達できれば最高なのですが、こちらについては

  • PowerShell(.NET)のサポートサイクルとWindows OSのサポートサイクルが合わない
  • Windows OSチームやプロダクトチーム側がPowerShell 7に対応する気がまったくもって無い
    • Microsoft謹製PowerShellモジュールのPowerShell 7対応状況は"悲惨"以外に形容できないですし一切擁護もできないです...

といった問題を抱えているため正直もう期待できないなという感じです。
残念ですがWindows PowerShell(5.1)とPowerShell Core(7.x)を併用する状況はこのまま続くと予想されます。

Windows OSにおけるPowerShellの将来は暗い感じなのですが、まあ、それはそれとしてPowerShellに慣れ親しんでいる人は新しいPowerShellを使えば良いでしょうし、そうでない人はそれぞれに合った選択肢を選べばよいだけだと思います。

私個人としては開発機の普段使いではPowerShell 7を使い、Windows Server管理にはPowerShell 5.1を使い続ける運用をしています。
最近はPowerShell 7以外にNushellも試しており、Nushellに完全移行する可能性もゼロではありません。

みなさんも自身の業務や用途に応じて最適なシェルを選ぶと良いと思います。