hack のためのネタ帳, etc,,,

まとめ

少なくとも Windows 10 20H2 の場合 PowerShell の「プロパティ」→「フォント」は、以下の設定になっている。
  • スタートメニュのショートカットは「Consolas」
  • ファイル名を指定して実行」や「PowerShell ウインドウをここで開く」は「Lucida Console」

これを適当な日本語対応のフォントに変更しておくと、Code Page 65001 (UTF-8) 環境で実行されるコマンド実行中に文字化けしなくなる。
FaceName を "__DefaultTTFont__" にしておくとシステムのデフォルトフォントを使ってくれるのだが、ショートカット ファイルにこれを設定する手段がないので、とりあえず書き捨てのスクリプトを書いてみた。

状況

winget の実行中にマルチバイトコードが文字化けする件について調べた。

とりあえず、コード ページが怪しいなと言う感じなのだが、「winget powershell 文字化け」でググると、以下のページを見つけた。

とりあえず、タイトルバーのアイコンから「プロパティ」出してフォントを変えてみると確かに文字化けしなくなるのだが、これどこに設定されてるんだよ?っていう。
一旦変えると元に戻す方法が分からなくてしばらく困った。

結論から言うと、
スタートメニューから開いてるやつは、
  • %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
つまりは
  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
以下にあるショートカット ファイル、
「ファイル名を指定して実行」や「PowerShell ウインドウをここで開く」から開いたやつは、
  • HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
  • HKEY_CURRENT_USER\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe
以下にあるレジストリ Key/Value のようだ。
既定値は、conhost.exe 使ってるシェル(コマンドプロンプト, PowerShell, wsl 等)共通で、
  • HKEY_CURRENT_USER\Console
以下にあるレジストリの Key/Value らしい。

ここで、スタートメニューから起動した PowerShell のプロパティは
  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell.lnk
  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell (x86).lnk
が書き換えられてしまうため、元に戻すには
  • C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
以下にある同名のショートカットをコピーしてくる以外に方法がなさそう。
レジストリの方はバックアップがないとお手上げっぽいので、新規ユーザー作成してコピーだろうか?
因みに C:\Users\Default のショートカットと新規ユーザーのレジストリは以下の状態だった。

$ xxd Windows\ PowerShell.lnk

$ base64 Windows\ PowerShell.lnk


$ xxd Windows\ PowerShell\ \(x86\).lnk

$ base64 Windows\ PowerShell\ \(x86\).lnk


HKCU%2FConsole.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ColorTable00"=dword:000c0c0c
"ColorTable01"=dword:00da3700
"ColorTable02"=dword:000ea113
"ColorTable03"=dword:00dd963a
"ColorTable04"=dword:001f0fc5
"ColorTable05"=dword:00981788
"ColorTable06"=dword:00009cc1
"ColorTable07"=dword:00cccccc
"ColorTable08"=dword:00767676
"ColorTable09"=dword:00ff783b
"ColorTable10"=dword:000cc616
"ColorTable11"=dword:00d6d661
"ColorTable12"=dword:005648e7
"ColorTable13"=dword:009e00b4
"ColorTable14"=dword:00a5f1f9
"ColorTable15"=dword:00f2f2f2
"CtrlKeyShortcutsDisabled"=dword:00000000
"CursorColor"=dword:ffffffff
"CursorSize"=dword:00000019
"DefaultBackground"=dword:ffffffff
"DefaultForeground"=dword:ffffffff
"EnableColorSelection"=dword:00000000
"ExtendedEditKey"=dword:00000001
"ExtendedEditKeyCustom"=dword:00000000
"FaceName"="__DefaultTTFont__"
"FilterOnPaste"=dword:00000001
"FontFamily"=dword:00000000
"FontSize"=dword:00100000
"FontWeight"=dword:00000000
"ForceV2"=dword:00000001
"FullScreen"=dword:00000000
"HistoryBufferSize"=dword:00000032
"HistoryNoDup"=dword:00000000
"InsertMode"=dword:00000001
"LineSelection"=dword:00000001
"LineWrap"=dword:00000001
"LoadConIme"=dword:00000001
"NumberOfHistoryBuffers"=dword:00000004
"PopupColors"=dword:000000f5
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:23290078
"ScreenColors"=dword:00000007
"ScrollScale"=dword:00000001
"TerminalScrolling"=dword:00000000
"TrimLeadingZeros"=dword:00000000
"WindowAlpha"=dword:000000ff
"WindowSize"=dword:001e0078
"WordDelimiters"=dword:00000000

[HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe]
"ColorTable05"=dword:00562401
"ColorTable06"=dword:00f0edee
"FaceName"="Lucida Console"
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190
"PopupColors"=dword:000000f3
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:0bb80078
"ScreenColors"=dword:00000056
"WindowSize"=dword:00320078

[HKEY_CURRENT_USER\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe]
"ColorTable05"=dword:00562401
"ColorTable06"=dword:00f0edee
"FaceName"="Lucida Console"
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190
"PopupColors"=dword:000000f3
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:0bb80078
"ScreenColors"=dword:00000056
"WindowSize"=dword:00320078


レジストリは
PowerShell codepage determine console」でググった際、
からたまたま HKCU/Console を見かけて。

「既定値」「プロパティ」の記録箇所がレジストリとショートカット ファイルの2箇所にあることは、以下の確認をしていて気付いた。

まず、スタートメニューから PowerShell を実行し、ウインドウ左上のアイコンから「既定値」や「プロパティ」を確認してみると、以下のようになっていた。
  • 既定値
    • フォント
      • サイズ : 16
      • フォント : MS ゴシック
  • プロパティ
    • オプション
      • 現在のコード ページ : 932 (ANSI/OEM - 日本語 Shift-JIS)
    • フォント
      • サイズ : 14
      • フォント : MS ゴシック

次に、初期化された状態の winget で winget list などを実行し、入力待ちの文字化けした状態で確認してみると、以下のようになっていた。
  • 既定値
    • フォント
      • サイズ : 16
      • フォント : MS ゴシック
  • プロパティ
    • オプション
      • 現在のコード ページ : 65001 (UTF-8)
    • フォント
      • サイズ : 14
      • フォント : Consolas

一方、「⊞ (Windows Logo Key) + R」で「ファイル名を指定して実行」から「powershell」を起動したり、「SHIFT + 右クリック」から「PowerShell ウインドウをここで開く」から開いた場合、「既定値」や「プロパティ」は以下のようになっていた。
  • 既定値
    • フォント
      • サイズ : 16
      • フォント : MS ゴシック
  • プロパティ
    • オプション
      • 現在のコード ページ : 932 (ANSI/OEM - 日本語 Shift-JIS)
    • フォント
      • サイズ : 16
      • フォント : MS ゴシック

また、こちらを winget で文字化けさせた状態にして確認してみると、以下のようになっていた。
  • 既定値
    • フォント
      • サイズ : 16
      • フォント : MS ゴシック
  • プロパティ
    • オプション
      • 現在のコード ページ : 65001 (UTF-8)
    • フォント
      • サイズ : 16
      • フォント : Licida Consolas

とりあえず、
  • HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
↓ rename
  • HKEY_CURRENT_USER\Console\#%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
とすると、「ファイル名を指定して実行」や「PowerShell ウインドウをここで開く」から開く PowerShell が「既定値」と同じ状態で開く。
「プロパティ」に変更を加えると新たに
  • HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
が生成される。

以上、まとめると、
  • 「既定値」や「プロパティ」で設定したフォントが現在のコードページを表現出来ない場合、"__DefaultTTFont__" で代替?
  • winget のようなコマンドが実行されるタイミングで Code Page が「932 (ANSI/OEM - 日本語 Shift-JIS)」から「65001 (UTF-8)」に変わる際に「既定値」や「プロパティ」で設定したフォントが有効になる
  • コマンドが終了したタイミングで元に戻る
って動作になってるんじゃないかと思う。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます