treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Remove-AppxPackageしたWindows10標準アプリ(UWP)をコマンドで復旧する

Windows10になってから、不要なアプリが標準で結構導入されていて、初期セットアップ時に削除しているケースも多いかと思います。
ただ、今回、勢いよく削除したアプリが必要とされたので、対処しなきゃいけなくなった、という話をご報告です。

削除したWindows10標準(UWP)アプリ

巷でWindows10標準アプリと呼ばれる(通常は)Microsoftストア経由でインストールされるUWPアプリ。
これが、Windows10インストール直後から標準でOSに盛り込まれているので初期セットアップ時にはザクザク削除していきます。
例えば、
--------------------------------------------------------------
Get-AppxPackage Microsoft.XboxApp | Remove-AppxPackage
Get-AppxPackage Microsoft.XboxGamingOverlay | Remove-AppxPackage
Get-AppxPackage Microsoft.WindowsFeedbackHub | Remove-AppxPackage
Get-AppxPackage Microsoft.People | Remove-AppxPackage
Get-AppxPackage Microsoft.Messaging | Remove-AppxPackage
--------------------------------------------------------------
こんな感じ。バッチファイルにした場合には
--------------------------------------------------------------
ファイル名:Win10appDelete.bat
--------------------------------------------------------------
PowerShell -command "Get-AppxPackage Microsoft.XboxApp | Remove-AppxPackage"
PowerShell -command "Get-AppxPackage Microsoft.XboxGamingOverlay | Remove-AppxPackage"
PowerShell -command "Get-AppxPackage Microsoft.WindowsFeedbackHub | Remove-AppxPackage"
PowerShell -command "Get-AppxPackage Microsoft.People | Remove-AppxPackage"
PowerShell -command "Get-AppxPackage Microsoft.Messaging | Remove-AppxPackage"
--------------------------------------------------------------

こういった感じで、行頭に<PowerShell -command >を付与し、PowerShellコマンドレット自体は「""」で括ってバッチファイルで一括実行できます。

しかし、上記で削除したアプリケーションが必要になったときどうしよう…。というのが今回の発端です。

必要になったので入れて欲しい

「PC画面を録画したいんですけど、できないんですよね。」

「Xbox Game Barがあれば画面録画が可能らしいのですが、どうも入っていないようなんです。Windows10標準のアプリケーションのはずですが…。」

あぁ…、それ、わざわざ削除しておりますんで、使えない状態になっていますね…。(気まずい)

「では、いつも通り入れ直していただければ。」

というわけで、初期セットアップ時に削除したWindows10標準アプリを再び入れなきゃ行けなくなってしまいました。

手動で入れ直す以外の方法を模索

Microsoftストアアプリを開いて、MicrosoftアカウントなしでもGUIからインストールは可能なのですが、環境の都合でコマンドで(直接画面を操作することなく)実行する必要がありました。

結構調べたのですが、削除はPowerShellコマンドレットで実施している情報は多くあるのですが、再インストール(入れ直す)の情報はそれほど多くありません。ほとんどはMicrosoftストアアプリ(GUI)画面からインストールし直す、というもの。

Microsoftストアアプリなら
■[Microsoft] 消してしまった Microsoft Store アプリを復活(再インストール)する方法

https://qiita.com/sengoku/items/49ee1a35b88b65936d90

■Restore Microsoft Store in Windows 10 after uninstalling it with PowerShell

https://www.winhelponline.com/blog/restore-windows-store-windows-10-uninstall-with-powershell/

情報がありました。
うーん。これの応用?

状態確認

上述の参考URLには、<Remove-AppXPackage>で削除したアプリは、実際には消えていないためマニフェストファイルを(残存するディレクトリから)取得して、再インストール(有効化、というほうが合っているのかも)を実行するという趣旨の解説が掲載されています。

試しに、
Get-AppxPackage Microsoft.XboxGamingOverlay | Remove-AppxPackage
を実行したあと、このマニフェストファイルが保管されているディレクトリがどうなっているかをテスト環境で実行してみました。
※ちなみに、<c:\Program Files\WindowsApps>ディレクトリはアクセス制限が掛かっていますので、管理者として実行したコマンドプロンプトでないと、カレントディレクトリに変更できません。

--------------------------------------------------------------
コマンド実行前
--------------------------------------------------------------
c:\Program Files\WindowsApps>dir /b | findstr XboxGame
Microsoft.XboxGameOverlay_1.54.4001.0_neutral_split.scale-100_8wekyb3d8bbwe
Microsoft.XboxGameOverlay_1.54.4001.0_neutral_~_8wekyb3d8bbwe
Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe
--------------------------------------------------------------
c:\Program Files\WindowsApps\Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe>dir /b
AppxBlockMap.xml
AppxManifest.xml
AppxMetadata
AppxSignature.p7x
Assets
GameBar.exe
GameBar.winmd
GameBarTasks.dll
GameBarTasks.winmd
KnownGameList.bin
KnownGameListRS3.bin
KnownGameListRS4.bin
resources.pri
--------------------------------------------------------------

次に、<Get-AppxPackage Microsoft.XboxGamingOverlay | Remove-AppxPackage>を実行後にディレクトリ内のファイルの状態を確認してみました。

こうやって実行して、

f:id:treedown:20211208170336p:plain

Get-AppxPackageコマンドで存在が消えたことを確認します。ちなみに、再インストール前にOS再起動が必要です。

f:id:treedown:20211208170109p:plain
このように、コマンド実行後でもなにも表示されなくなったら、<Remove-AppXPackage>で削除されている状態と判断できます。

--------------------------------------------------------------
コマンド実行後(OS再起動後)
--------------------------------------------------------------
c:\Program Files\WindowsApps>dir /b | findstr XboxGame
Microsoft.XboxGameOverlay_1.54.4001.0_neutral_split.scale-100_8wekyb3d8bbwe
Microsoft.XboxGameOverlay_1.54.4001.0_neutral_~_8wekyb3d8bbwe
Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe
--------------------------------------------------------------
c:\Program Files\WindowsApps\Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe>dir /b
AppxBlockMap.xml
AppxManifest.xml
AppxMetadata
AppxSignature.p7x
Assets
GameBar.exe
GameBar.winmd
GameBarTasks.dll
GameBarTasks.winmd
KnownGameList.bin
KnownGameListRS3.bin
KnownGameListRS4.bin
resources.pri
--------------------------------------------------------------

[Remove-AppxPackage]を実行したあとでも、保管されている<c:\Program Files\WindowsApps\>配下の該当ディレクトリ内のファイルは変更がありませんでした。削除といっても、実体となるファイルが削除されるわけではないようです。

PowerShellコマンドレットで復旧する

PowerShellコマンドレットで復旧するには、<AppxManifest.xml>を使って再度登録すれば復旧できるようです。

復旧には「Add-AppxPackage」コマンドレットを使います。

Add-AppxPackage -Register "ファイルのフルパス" -DisableDevelopmentMode

今回のケースでは、

Add-AppxPackage -Register "c:\Program Files\WindowsApps\Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe" -DisableDevelopmentMode

と実行すれば、復旧できると思っていましたが、

f:id:treedown:20211208170506p:plain

エラーとなって上手くいかない…。
ふと思ったのですが、以前にファイルのパスを囲むときは「"」じゃなくて「'」を使っていたのを思い出して、もしかして、と思い、変更して実行してみました。

Add-AppxPackage -Register 'c:\Program Files\WindowsApps\Microsoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbwe' -DisableDevelopmentMode

できました。

f:id:treedown:20211208170525p:plain

[Add-AppxPackage]実行後には、Get-AppxPackageコマンドで表示されなくなっていた対象アプリが、再び表示されるようになりました。

スタートメニューにも変化が

f:id:treedown:20211208170538p:plain

このように、「最近追加されたもの」に、[Add-AppxPackage]実行によって追加されたアプリが再び表示されています。[Add-AppxPackage]実行によって再び追加されたためと考えられます。

バッチファイルにするとき

恒例のバッチファイルにするときは、

--------------------------------------------------------------
ファイル名:AddXbxGB.bat
--------------------------------------------------------------
Powershell -Command Add-AppxPackage -Register 'C:\Program Files\WindowsApps\Microsoft.XboxGamingOverlay_*_*__*\AppxManifest.xml' -DisableDevelopmentMode
--------------------------------------------------------------

行頭に<PowerShell -command >を付与したこの一文をバッチファイル(ここではAddXbxGB.bat)として保存し、管理者として実行したコマンドプロンプトで実行することで有効化されます。

思ったのですが、
Get-AppxPackage Microsoft.%AppNAME% | Remove-AppxPackage
で削除するまえに、マニフェストファイル<AppxManifest.xml>の場所を把握しておいた方がいいのかもとふと思いました。