PowerShellを使用してシステム内のフォントを一覧表示する方法

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設定では見えるのに特定アプリで見えない場合、アプリ再起動、対応フォント形式、アーキテクチャ、キャッシュ、ライセンス、アプリ固有の除外を確認します。レジストリ登録を増やして解決しようとしません。

検証と安全な運用

  1. [設定]→[個人用設定]→[フォント]で代表フォントを検索する。
  2. HKLMとHKCUの登録件数、システムとユーザーフォルダーのファイル件数を別々に記録する。
  3. 代表フォントについて登録値、実ファイル、設定画面、対象アプリの4点を突き合わせる。
  4. 見つからないファイル、重複表示、TTC、ユーザー単位、別パス登録を例外として抽出する。
  5. CSVの件数、文字コード、実行ユーザー、PowerShell版、取得時刻を確認する。

変更や削除は別手順にする

棚卸し中にレジストリ値やFontsフォルダーを変更しません。フォントはセッションやアプリで使用中になり、手動削除でアプリやWindows表示へ影響する場合があります。削除が必要なら[設定]のフォント管理またはメーカーのアンインストーラーを優先し、依存文書、業務アプリ、全ユーザー/現在ユーザーの範囲、ライセンス、復元用インストーラーを確認します。

誤って削除した場合に別PCからフォントファイルをコピーするのは、バージョン差やライセンスの問題があります。Windowsのオプション機能、Microsoft Store、正規インストーラー、OS修復など承認された復元元を使います。この記事のCSVはインベントリであり、フォントファイルそのもののバックアップではありません。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次