たまに Winget でアプリ ID を使ってインストールとアンインストールしているのですが、アプリ ID の確認が簡単にできる方法があったので、残しておきます。
Winget とは?
Winget は、Microsoft が提供する Windows 用のパッケージ管理ツールであり、コマンドラインで、ソフトウェアの検索、インストール、更新、削除を効率的に行うことができます。なお、開発は GitHub で行われています。
GitHub - microsoft/winget-cli
https://github.com/microsoft/winget-cli
私が思う Winget の使いにくいところ
Microsoft Store にあるアプリを簡単にインストールできたり、パッケージをローカルにダウンロードできたりと、非常に有用なツールなのですが、アプリの検索性が悪いと思っています。具体的には、ペイントや電卓を検索すると検索結果がたくさん出てきて、どれが目的のペイントや電卓なのかわかりません。しかも英語名で指定しないといけないです。
解決方法としては、Microsoft Store のアプリには、ストアの製品 ID がついており、この ID を指定することで確実にアプリを指定できます。ただ、その ID って確認するの大変じゃない?
確認方法としては、winget show
コマンドでパッケージの詳細を確認するほかに Microsoft Store には、Web 版があり、URL に ID が入っているので、URL から ID が確認する方法があります。例えば、電卓は以下の URL ですので、"9wzdncrfhvn5" が ID だとわかります。
Windows 電卓:
https://apps.microsoft.com/detail/9wzdncrfhvn5?hl=ja-jp&gl=JP
winget show
コマンドでも、Web 版 Microsoft Store にしても、検索しないといけないのは変わらないのでなんだかな~ってかんじです。
イベントログを眺めていたら
別件で、System のイベントログを眺めていたら ID19 でこんなのが記録されているのを見つけました。
インストールの成功: 次の更新プログラムが正しくインストールされました: 9WZDNCRFHVN5-MICROSOFT.WINDOWSCALCULATOR
この9から始まる英数字は、もしかして電卓のアプリ ID なのでは...
他のイベントログを見てみると、アプリをインストールするとその ID とアプリ名が System のイベントログに記録されるみたいでした。
イベントログから ID を Get
イベントログにアプリ ID が記録されることがわかったので、さくっと PowerShell でアプリの ID をリストできるスクリプトを作ってみました。
PowerShell スクリプト
イベントログから ID 19 とアプリインストール関連のイベントを抽出し、ID、Microsoft Store URL、アプリ名を CSV ファイルで出力するスクリプトです。
# イベントログファイル
$filePath = "C:\path\to\System.evtx"
# .evtx を .txt に置き換える
$outFilePath = $filePath -replace '\.evtx$', '_19.csv'
# ファイルが存在すれば削除
if (Test-Path -Path $outFilePath) {
Remove-Item -Path $outFilePath
}
# ID からイベントログをフィルター
$eventdata = Get-WinEvent -Path $filePath -FilterXPath "Event/System[EventID=19]" |
Where-Object{$_.Message -match "(9[A-Z0-9]{11})"} |
Select-Object @{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} -Unique
# ID、Microsoft Store URL、アプリ名を CSV ファイルで出力
$array = New-Object System.Collections.ArrayList
foreach ($data in $eventdata) {
if ($data.Message -match "(9[A-Z0-9]{11})") {
$id = $matches[1]
$url = "https://apps.microsoft.com/detail/$($id.ToLower())`?hl=ja-jp&gl=JP"
$appName = ($data.Message -split '-')[1]
$Object = [PSCustomObject] @{
id = $id
url = $url
appName = $appName
}
$array.Add($Object)
}
}
$array | Sort-Object appName | Export-Csv -Path $outFilePath -NoTypeInformation -Encoding UTF8
実行結果まとめ
Windows 11 22H2 で実行した結果をまとめてみました。アプリ名は、実際に表示されているアプリの名前ではないので、対応付けが難しいかもしれません。
MICROSOFT.ZUNEMUSIC が、Windows メディア プレーヤーとは...
さいごに
アプリの更新を一度してみないとこの方法で ID を確認することはできませんが、winget で未知のアプリをインストールする場面はないと思うのでよしとします。