PowerShell 7 からアップデートの通知機能が導入されます

PowerShell Core

しばたです。
先日リリースされたPowerShell 7 Preview.5の新機能の一つに起動時のアップデート通知があります。

起動時のアップデート通知

こちらは標題の通りですが、PowerShellを起動した時により新しいバージョンがリリース済みの場合「新しいバージョンのPowerShellが利用可能です。」と通知してくれるものになります。
現時点では通知だけで自動更新するところまでは実装されていません。

機能については今回リリースされたばかりで実際に試すことができないのでPowerShell Team Blogの記事からイメージ図を引用すると、

(PowerShell 7 Preview 5 | PowerShell より)

の様に表示されるそうです。
次のリリース(PowerShell 7 Preview.6)が待ち遠しいですね。

【2019.11.22追記】

本日PowerShell 7 Preview.6がリリースされ、新バージョンの通知が無事動作してくれました。

【追記ここまで】

オプトアウト方法

このアップデート通知は通常のコンソール起動時に行うため-NoLogoパラメーターを付けて起動したときはアップデートチェック自体を行いません。
またPOWERSHELL_UPDATECHECK_OPTOUT環境変数が"true""1""yes"以外の値に設定されている場合もアップデートチェックを行わずオプトアウトすることができます。

実装について

現在PowerShell CoreはオープンソースなプロジェクトとしてGitHub上でソースコードおよび成果物が管理されています。
今回の通知機能はGitHub REST API(v3)を利用し最新のリリース情報を取得し、現在実行されているPowerShellのバージョンと比較をしてアップデートを通知する実装となっています。
処理タイミングはコンソール起動時に1回のみ実行されます。

GitHub APIは独自にアクセスキーを取得しない状態ではレートリミットが結構厳しく、大規模な組織(同一グローバルIPを共有する場合)においてはリミットオーバーで更新通知がされないといったことが起きそうな気がします。(ただGitHubもMicrosoft傘下になったのでそこは何とでもなりそうな気はします)
リリースされたばかりでまだ問題は顕在化してませんが、いずれ問題になるんじゃないかなぁ、と勝手に思っています。

実装の細かいところは最初のプルリクエストを見ると参考になります。
(いまは幾つか追加の修正が入っているので注意)

【補足】自作モジュール PSCoreUpdate の紹介

最初に説明したとおり今回の機能は通知のみでありバージョンアップは手動で行う必要があります。
WindowsおよびmacOSでパッケージマネージャを使っていない環境であれば拙作のモジュール PSCoreUpdate を使う事で楽にアップデートをできる様になります。

このモジュールはもともとWindows環境でパッケージマネージャを使いたくない、macOS環境でHomebrewをインストールするのがダルい(これは環境に依るのですが...)のを解消するために作りました。

PowerShell Galleryからモジュールをインストールし、

# PowerShell Gallery からモジュールをインストール
Install-Module PSCoreUpdate -Scope CurrentUser

Update-PowerShellCoreコマンドレットを呼び出すと指定バージョンのインストーラーをダウンロードし実行するとこまで自動化してくれます。(オプションでサイレントインストールも可能です)

Update-PowerShellCore -Latest

そして今回の様なアップデートチェックはTest-LatestVersionコマンドレットで可能です。

Test-LatestVersion

自分で言うのもアレですが私はこのモジュールを便利に使えていますのできっと皆さんの役にも立つと思います。ぜひ使ってみてください。

注意事項

例によってこの機能は試験的な機能として導入されています。
プレビュー版のPowerShellでは既定で試験的な機能が利用可能となっているため直ちにアップデート通知を利用できますが、試験的な機能を明示して無効にしている場合は以下のコマンドで機能を有効にしてください。

# Scopeは環境に応じて変えてください
Enable-ExperimentalFeature -Name PSUpdatesNotification -Scope CurrentUser