Windowsの標準PowerShellにはGet-Fontというコマンドはありません。システム全体の登録フォントはHKLMのFontsレジストリと%WINDIR%\Fonts、現在ユーザーだけのフォントはHKCUのFontsレジストリと%LOCALAPPDATA%\Microsoft\Windows\Fontsを読み取り、登録名と実ファイルを分けて一覧化します。最初に[設定]→[個人用設定]→[フォント]で対象フォントが見えるか確認し、PowerShellではレジストリを変更せずGet-ItemPropertyとGet-ChildItemだけを使ってください。アプリが一時的・非公開にロードしたフォントは、この永続登録一覧に現れない場合があります。
「インストール済み」の意味を分ける
- 全ユーザー向け登録:通常HKLMのFontsキーとWindows Fontsフォルダーに対応し、管理者権限で導入する。
- ユーザー単位登録:現在ユーザーのHKCU FontsキーとLocalAppData配下のFontsフォルダーに対応する。別ユーザーの一覧とは限らない。
- フォントファイル:ttf、otf、ttc等。1ファイルに複数フェイスが含まれることがあり、ファイル数とフォント表示数は一致しない。
- 一時/アプリ専用フォント:AddFontResourceExのFR_PRIVATEやFR_NOT_ENUM等でプロセス内にロードされ、通常一覧やレジストリへ永続登録されないことがある。
[設定]のフォント一覧は利用者が使えるフォントの確認に適します。レジストリは表示名とファイル参照、フォルダーは物理ファイルの棚卸しに適します。どれか一つを「完全なシステム内フォント一覧」と断定せず、目的に応じて突き合わせます。
全ユーザー向けの登録情報を取得する
$systemKey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
$systemValues = (Get-ItemProperty -LiteralPath $systemKey).PSObject.Properties |
Where-Object MemberType -eq 'NoteProperty' |
Where-Object Name -notlike 'PS*' |
Select-Object @{n='Scope';e={'AllUsers'}}, @{n='DisplayName';e={$_.Name}}, @{n='RegisteredFile';e={$_.Value}}
$systemValues | Sort-Object DisplayName | Format-Table -AutoSize
値名がフォントの登録表示名、値がファイル名またはパスです。値がファイル名だけなら通常%WINDIR%\Fonts配下を参照しますが、別パスが登録される場合もあるため、文字列連結だけで存在を決めません。環境変数を展開し、絶対パスか相対ファイル名かを分けます。レジストリは読み取りだけにします。
現在ユーザー向けの登録情報を取得する
$userKey = 'HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
if (Test-Path -LiteralPath $userKey) {
$userValues = (Get-ItemProperty -LiteralPath $userKey).PSObject.Properties |
Where-Object MemberType -eq 'NoteProperty' |
Where-Object Name -notlike 'PS*' |
Select-Object @{n='Scope';e={'CurrentUser'}}, @{n='DisplayName';e={$_.Name}}, @{n='RegisteredFile';e={$_.Value}}
$userValues | Sort-Object DisplayName | Format-Table -AutoSize
}
HKCUはPowerShellを実行した現在ユーザーのハイブです。管理者として別資格情報で起動すると、調べたい利用者とは異なるHKCUになることがあります。端末上の全ユーザーを調べるために、他ユーザーのNTUSER.DATを無断でロードしません。必要なら利用者ごとに同じ読み取りスクリプトを実行するか、承認された管理収集基盤を使います。
フォントフォルダーのファイルを列挙する
$systemFontDir = Join-Path $env:WINDIR 'Fonts'
$userFontDir = Join-Path $env:LOCALAPPDATA 'Microsoft\Windows\Fonts'
Get-ChildItem -LiteralPath $systemFontDir -File -Force -ErrorAction SilentlyContinue |
Select-Object @{n='Scope';e={'AllUsersFolder'}}, Name, Extension, Length, LastWriteTime, FullName
if (Test-Path -LiteralPath $userFontDir) {
Get-ChildItem -LiteralPath $userFontDir -File -Force |
Select-Object @{n='Scope';e={'CurrentUserFolder'}}, Name, Extension, Length, LastWriteTime, FullName
}
FontsフォルダーはExplorerで特殊なシェル表示になるため、PowerShellのファイル列挙と見え方が異なる場合があります。拡張子はttf、otf、ttc、fon等を想定しますが、拡張子だけで正常なフォントと断定しません。LastWriteTimeはインストール日時を保証せず、コピー、更新、OS展開で変化します。旧記事にあるInstallDateや使用頻度という標準プロパティは、この方法からは得られません。
登録と実ファイルを突き合わせる
監査では、レジストリに登録があるがファイルが見つからない項目、フォルダーにファイルがあるが登録値と対応しない項目を分けます。ただしTTCのコレクション、ファイル名の相対参照、別場所登録、OSの保護フォント、アプリ専用フォントがあるため、単純な未一致を直ちに削除候補にしません。設定画面と対象アプリで利用可否を確認します。
$allRegistrations = @($systemValues) + @($userValues)
$allRegistrations | Sort-Object Scope, DisplayName |
Export-Csv -LiteralPath (Join-Path $env:USERPROFILE 'Documents\font-registrations.csv') -NoTypeInformation -Encoding utf8
変数$userValuesが未作成の環境では、事前に$userValues=@()と初期化すると安定します。CSVにはフォント名とローカルパスが含まれるため、出力先を確認します。システムフォント自体をコピーして他端末へ配布するとライセンス違反になる可能性があり、棚卸しCSVとフォントファイルの持ち出しを混同しません。
32ビットと64ビットのレジストリ表示
64ビットWindows上で32ビットPowerShellを使うと、レジストリリダイレクトの影響を受ける可能性があります。[Environment]::Is64BitProcessでホストを確認し、通常は64ビットPowerShellで収集します。インストーラーのアーキテクチャやWOW64表示差が疑われる場合は、Microsoft.Win32.RegistryKeyのOpenBaseKeyでRegistry64とRegistry32を明示して比較します。片方だけを見て未登録と断定しません。
[pscustomobject]@{
Is64BitOS = [Environment]::Is64BitOperatingSystem
Is64BitProcess = [Environment]::Is64BitProcess
PowerShell = $PSVersionTable.PSVersion.ToString()
}
Windows PowerShell 5.1とPowerShell 7では、既定文字コードや一部プロバイダー動作が違います。複数端末の差分を取るならPowerShell版、プロセスのビット数、Windowsビルド、実行ユーザー、収集時刻をCSVのメタデータとして一緒に残します。
ファミリー名やスタイルが必要な場合
レジストリ値名はフォントの表示名に近いものの、OpenType内部のFamily、Subfamily、PostScript名を正規化した結果ではありません。1つのTTCに複数ファミリー、1ファミリーにRegular/Bold等の複数ファイルがあるため、表示名からファイル数を推測しません。厳密なメタデータが必要なら、組織で承認されたフォント解析APIやライブラリを検証し、ファイルを実行せず読み取り専用で解析します。
アプリが表示するフォント一覧は、DirectWrite、GDI、アプリ独自キャッシュ、クラウドフォント、埋め込みフォント、言語フォント機能の影響を受けます。Windows設定では見えるのに特定アプリで見えない場合、アプリ再起動、対応フォント形式、アーキテクチャ、キャッシュ、ライセンス、アプリ固有の除外を確認します。レジストリ登録を増やして解決しようとしません。
検証と安全な運用
- [設定]→[個人用設定]→[フォント]で代表フォントを検索する。
- HKLMとHKCUの登録件数、システムとユーザーフォルダーのファイル件数を別々に記録する。
- 代表フォントについて登録値、実ファイル、設定画面、対象アプリの4点を突き合わせる。
- 見つからないファイル、重複表示、TTC、ユーザー単位、別パス登録を例外として抽出する。
- CSVの件数、文字コード、実行ユーザー、PowerShell版、取得時刻を確認する。
変更や削除は別手順にする
棚卸し中にレジストリ値やFontsフォルダーを変更しません。フォントはセッションやアプリで使用中になり、手動削除でアプリやWindows表示へ影響する場合があります。削除が必要なら[設定]のフォント管理またはメーカーのアンインストーラーを優先し、依存文書、業務アプリ、全ユーザー/現在ユーザーの範囲、ライセンス、復元用インストーラーを確認します。
誤って削除した場合に別PCからフォントファイルをコピーするのは、バージョン差やライセンスの問題があります。Windowsのオプション機能、Microsoft Store、正規インストーラー、OS修復など承認された復元元を使います。この記事のCSVはインベントリであり、フォントファイルそのもののバックアップではありません。

コメント