WinGetでPowerShellをアップデートできなかった

インストールテクノロジが現在インストールされているバージョンと異なります

最近PowerShellを起動すると以下のようなメッセージが出るようになりました。

A new PowerShell stable release is available: v7.6.0 Upgrade now, or check out the release page at: https://aka.ms/PowerShell-Release?tag=v7.6.0

PowerShell 7.6がリリースされたんですね。OK WinGet、アップグレードは利用できるかな?

PS C:\work>winget list --id Microsoft.PowerShell --upgrade-available
名前                   ID                   バージョン 利用可能 ソース
----------------------------------------------------------------------
PowerShell 7.5.5.0-x64 Microsoft.PowerShell 7.5.5.0    7.6.0.0  winget
1 アップグレードを利用できます。

いけるみたいですね。ではアップグレードしましょう。

PS C:\work>winget upgrade --id Microsoft.PowerShell
新しいバージョンが見つかりましたが、インストールテクノロジが現在インストールされているバージョンと異なります。パッケージをアンインストールして、新しいバージョンをインストールしてください。

???

Microsoft Updateが原因かも?

winget list実行時のソースもwingetになっているので、「インストールテクノロジ」が異なるということはないと思ったのですが、調べてみるとMicrosoft UpdateでPowerShellがアップデートされていると発生することがあるみたいです。以下のissueが参考になりました。

Unable to update to version 7.5.4.0 with winget: "install technology is different from the current version installed" · Issue #26325 · PowerShell/PowerShell

ここのコメントにコントリビューターの方が以下のコメントを書いてくれています。

This I belive is due to running winget upgrade as winget returns the PowerShell package name as PowerShell 7.5.3.0-x64 instead of PowerShell then this points to it not having been installed via winget in my experience & is like this one all my devices that have had PowerShell upgraded via Microsoft Update.

私の今の環境でも7.5.5.0-x64と表示されているのでたぶん似たような状況なのでしょう。

ちなみに、Microsoft UpdateというのはPowerShell v7.2から導入された機能で、

従来の Windows Update (WU) 管理フローで最新の PowerShell 7 更新プログラムが取得されます。

というものです。

この問題は定期的に発生しているみたいで、WinGetのDiscussionsにもちょっと愚痴みたいなコメントが付いてます。たしかに不便ではある。

再インストールしかないみたい

じゃあどうすればいいのかというと再インストールです。幸いにも以下のコマンドだけでアンインストールとインストールが両方できるみたいです。

winget install --id Microsoft.PowerShell --source winget --version 7.6.0.0 --uninstall-previous --force

--uninstall-previousを指定することで旧バージョンをアンインストールできます。これですんなりインストールできました。

Microsoft Updateを無効にする?

v7.2以降、Microsoft Updateはデフォルトで有効になっているようです。ぜんぜん意識してなかったんですが、WinGetでインストールしたPowerShellでもMicrosoft Updateが有効なんですね。

Preview updating PowerShell 7.2 with Microsoft Update - PowerShell Teamによると、Microsoft Updateの有効/無効の設定はレジストリで管理されているようで、以下で確認すると確かにUseMuが有効(1)になっていました。

PS C:\work> Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PowerShellCore"
UseMU        : 1
...

もしMicrosoft Updateが原因なのであれば無効にする手もありそうです。レジストリの値を以下のように変更すればいいみたいです。

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PowerShellCore" -Name "UseMu" -Value 0 -Type DWord

個人的には(ちょっと気持ち悪いですが)Microsoft Updateは便利な機能だとも思っているので、あえて無効にする必要もないかなと思っています。

WinGetでアップグレードできないのは不便ではあるんですが、パッチレベルはMicrosoft Updateが自動的に上げくれるし、多くて1年に1回くらいの頻度でしか実行しないので、まあ許容範囲かなと思っています。winget upgrade --allとか定期的にやっているわけでもないし。

(ちゃんと)WinGetで定期的にアップデートしている方はMicrosoft Updateを無効にしてみてもいいかもしれません。