オレとChatGPT

AIとの会話記録

フォント一覧の出力スクリプト

オレ

windowspowershell を使ってインストールされているフォントの一覧を fontlist.txt というファイルに書き出すスクリプトを教えて下さい。


GPT-4: Web Browsing

WindowsPowerShell を使用して、インストールされているフォントの一覧を fontlist.txt というファイルに書き出すスクリプトは以下の通りです:

Get-ChildItem 'C:\Windows\Fonts' -Recurse | Where-Object { $_.PSIsContainer -eq $false } | ForEach-Object { $_.BaseName } > fontlist.txt

このスクリプトは、Windows のフォントディレクトリ(通常は C:\Windows\Fonts)を調べて、その中のすべてのフォントファイルをリストアップします。それから、各フォントファイルのベース名(拡張子を除いた名前)を fontlist.txt という名前のファイルに出力します。

注意: スクリプトは現在のディレクトリに fontlist.txt を作成します。ファイルを別の場所に作成したい場合は、出力パスを適宜変更してください。例えば、C:\Users\YourUsername\Documents\fontlist.txt のように。


オレ

フォントのファイル名の一覧は得られましたが、欲しいのはフォントの(現在使っている言語での)名前です。たとえば今はWindows11の日本語版を使っていますが。"メイリオ" のような名前で列挙したいです。


GPT-4: Web Browsing

すみません、その点は考慮しきれていませんでした。あなたが求めているのは、フォントの表示名で、それはフォントファイルの名前とは必ずしも一致しないことがあります。

WindowsPowerShell スクリプトで、インストール済みのフォントの表示名を取得するには、レジストリを調べる必要があります。以下のスクリプトはその一例です:

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' | ForEach-Object { $_.GetValue($null) } > fontlist.txt

このスクリプトは、Windowsレジストリの Fonts キーを調べ、その各エントリの既定値(フォントの表示名)を fontlist.txt という名前のファイルに出力します。

ただし、この方法では TrueType のコレクション(TTC)の各フォントが個別にリストされず、代わりにコレクション全体が一つとしてリストされます。また、一部のフォントは表示名がファイル名と一致するため、ファイル名が出力される可能性もあります。

上記スクリプトは現在のディレクトリに fontlist.txt を作成します。他の場所にファイルを作成する場合は、出力パスを適宜変更してください。


オレ

空のリストしか返ってきません。


GPT-4: Web Browsing

■Finished browsing

Windowsのインストールされているフォントの名前を取得するためのいくつかの方法があります。以下にそれらを示します。

1. .NET Frameworkの System.Drawing アセンブリを使用してフォント名を取得する方法:

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
(New-Object System.Drawing.Text.InstalledFontCollection).Families | Foreach-Object { $_.Name } > fontlist.txt

2. Windowsレジストリを照会する方法:

Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' | Out-File fontlist.txt

3. PresentationCore アセンブリを使用してフォント名を取得する方法:

Add-Type -AssemblyName PresentationCore
[Windows.Media.Fonts]::SystemFontFamilies | Select-Object -Property Source > fontlist.txt


それぞれのスクリプトはフォントの名前を fontlist.txt というファイルに書き出します。試してみて、一番適した方法を選んでみてください​1​。


オレ

1番目の方法で求めた結果が得られました、3番目の方法はおそらく標準の(英語の)表示名が得られました。2番目の方法では何も返って来ませんでした。


GPT-4: Web Browsing

結果を共有していただきありがとうございます。それぞれの方法が異なる結果をもたらすのは興味深いですね。

  1. .NET Framework の System.Drawing アセンブリを使用した方法が、正しく日本語のフォント名を取得できたとのことです。これはおそらく、System.Drawing ライブラリがシステムのロケール設定(この場合は日本語)を考慮してフォントの表示名を取得しているからだと思われます。

  2. Windows レジストリを照会した方法では何も返ってこなかったとのことです。これは、レジストリの Fonts キーにフォントの表示名が必ずしも含まれていない場合や、レジストリへのアクセスが何らかの理由で制限されている場合に起こり得ます。

  3. PresentationCore アセンブリを使用した方法では、英語のフォント名が得られたとのことです。これは、PresentationCore ライブラリがデフォルトのフォント名(通常は英語)を取得しているためと思われます。

ご利用の環境に最適な方法を見つけることができて、それがお役に立てたことをうれしく思います。何か他に質問があればお気軽にどうぞ。


感想

PowerShell には詳しくないので、Windows で手間のかかるバッチ的な処理をするときは、WSL のシェルを使うか、Python 等のスクリプト言語で誤魔化していましたが、ChatGPT に聞いて PowerShell でやるのは結構役に立つのではないかと思いました。

エラー時に酷いことにならないためにも、仕組み作って全部自動的にするよりも、このようにコマンドを一度出力されて目で確認してから、手元の PowerShell プロンプトに張り付けるの方法の方が安全で有用ではないかと思います。