今回は、UWPアプリの基本情報を保持するAppxManifest.xmlを解析して、一連のUWP解析の最後としたい。さて、このAppxManifest.xmlだが、Appx自体、Windows 8のストアアプリ用に作られたものであるため、このxmlファイルもストアアプリの時代から存在しており、そのため、複雑な仕様を持つ。その仕様については、Microsoftのサイトに仕様書がある。
●Package manifest schema reference for Windows 10
https://docs.microsoft.com/ja-jp/uwp/schemas/appxpackage/uapmanifestschema/schema-root
それによれば、アプリの名前は<DisplayName>タグにあることになっているのだが、これとは別にタイル用の定義が<uap:VisualElements>にある。このAppxManifest.xmlを扱うときに注意するのは、XMLネームスペース(XML Namespace、xmlns)が使われていることだ。
<uap:VisualElements>の先頭の「uap:」という部分がXMLネームスペースで、簡単にいうと、タグに複数の定義があるときに、ネームスペースを付けることでそれぞれを区別するためのものだ。前回のようにselectNodes()とXPathを使う方法は、ネームスペースがあるとアクセスが面倒になる。
具体的には、ネームスペースをXMLNamespaceManagerというオブジェクトに設定して、これをXPathと併用してSelectNodes()を使う必要がある。XPathが使えると「なんでもいいから属性DisplayNameを持ってるタグ」といった指定が使えて簡単で、かつ、XMLファイルの構造変化にも対応しやすいのだが、今回は、それ以外の方法を使う。
まずは、実際にどうなっているのか調べる
xmlファイルとはいえテキストファイルなので、単に行を取り出す程度の調査は比較的簡単できる。UWPアプリがインストールされている「C:\Program Files\WindowsApps\」を管理者権限で起動したPowershellで開く。以下のコマンドで、そこにインストールされているアプリのAppxManifest.xmlファイルからすべての<VisualElements>タグを表示させることができる。select-stringでは検索パターンに正規表現が使える。
Select-String ".\*_x64_*\AppxManifest.xml" -Pattern '\<.*VisualElements.*DisplayName=' | Out-GridView
前述の仕様書上は、<uap:VisualElements>というタグになっているが、ネームスペースがないもの、あっても、“uap:”以外のものがある。
サードパーティのアプリならば、まあ、よしとしようが、ネームスペースがないアプリの1つは、こともあろうかマイクロソフト製である。
DisplayNameタグを取り出す
まずは、簡単な方法として<DisplayName>タグを表示させる。まずは、appxmainfest.xmlを変数に読み込む部分だが、こちらは、専用のコマンドGet-AppxPackageManifestがある。変数$Manifestに読み込むとしたら、
$Manifest = Get-AppxPackage "*Messaging*" | Get-AppxPackageManifest
とする。「*Messaging*」は、パッケージ名の一部を表す文字列だ。正確にパッケージ名を指定してもいいのだが、Get-AppxPackageの場合には、このようにワイルドカードを含んだ指定が可能。これに対して、Get-AppxPackageManifestは、正確にパッケージ名を指定する必要があるため、Get-AppxPackageコマンドが出力するオブジェクトをパイプで渡している。
これはXMLオブジェクトとして出力されるので、キャストは不要である。こうしてXMLファイルを$Manifest変数に読み込ませれば、前回解説したように、タグ名をピリオドでつないでいけば、タグの値を得ることができる。前述の<DisplayName>タグなら、
$Manifest.Package.Properties.DisplayName
とすればよい。
この方法は簡単で、PowerShellがXMLオブジェクトと認識している状態では、タブキーによるタグ名の補完なども使えるのだが、階層構造に依存する記述方法になる。このXMLをPowershellのオブジェクトとして扱う方法では、階層構造が変わると、アクセスができず、かといってエラーにもならず、何もないことを示すNULLを返す。このため、スクリプトなどで処理しようとすると、エラーにならないけど、答えも出ないといったものになってしまい、結構デバッグが面倒な状態になる。
仕様書を見る限り、この構造は変わらないようなので、正しく作られたAppxManifestであれば、これでアクセスができる、はずであるが、前述のようにルールに従っていないタグが使われているようなので、注意は必要だ。
●AppxManifest.xml DisplayNameタグ
https://docs.microsoft.com/ja-jp/uwp/schemas/appxpackage/uapmanifestschema/element-displayname
実際に<DisplayName>タグではどういう定義がされているのかを調べてみよう。Get-AppxPackageでインストールされているアプリを列挙し、Get-AppxPackageManifestで得たXMLオブジェクトに対して直接<DisplayName>タグを表示させてみる。
(Get-AppxPackage -PackageTypeFilter Main | Get-AppxPackageManifest).Package.Properties.DisplayName | Out-GridView
このコマンドの出力結果が、以下の画面だ。
これを見ると、大半は各国語にローカライズするために「ms-resource:」で始まるリソース指定になっているが、中には、英語名しか指定していないものや、直接日本語で名前が指定されているものもある。
特定のUWPアプリのAppxManifest.xmlが変数$Manifestに読み込まれているなら、
$Manifest.Package.Properties.DisplayName
とすることで、<DisplayName>タグの値を取り出すことが可能だ。
この連載の記事
-
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? -
第418回
PC
Windows 11のスマートフォン連携は新機能が追加されるなど、いまだ進化している - この連載の一覧へ