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が参考になりました。
ここのコメントにコントリビューターの方が以下のコメントを書いてくれています。
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を無効にしてみてもいいかもしれません。