事の発端はteratailのこちらの質問から。
Windows 10以前の日本語Windows環境にPowerShell Core 6.1.0をインストールするとコンソールの日本語表示がおかしくなるという現象です。
【2019.03.29追記】PowerShell Core 6.2への影響
本日PowerShell Core 6.2がリリースされましたが、本件の原因であるPSReadlineがVer.2.0.0-bata.3のまま更新されていないので本エントリーの現象が引き続き発生するはずです。
影響のある環境
きちんと確認できたのは質問にあるWindows 8.1環境だけですが、おそらく、
- Windows 7
- Windows Server 2008 R2 ~ Windows Server 2012 R2
でも同じ現象が発生するハズです。
原因
直接の原因はPowerShell Core 6.1.0に同梱されているPSReadlineです。
PowerShell Core 6.1.0から同梱されるPSReadlineのバージョンが1.2→2.0.0-bata.3に上がり、PSReadline 2.0.0-bata.1~2.0.0-bata.3においてはコンソールのコードページをUTF-8(65001)に強制するコードが入ってており、Windows 10以前の古いOSでは日本語の描画がおかしくなってしまいます。
問題がPowerShell本体ではなくPSReadline側にあるので、Windows PowerShellにPSReadline 2.0.0をインストールしても同様の現象が発生してしまいます。
(Windows PowerShellにPSReadline 2.0.0をインストールする手順は割愛)
対処方法
この問題に対する対処方法は2つあります。
1. PSReadline 1.2を使用する
PSReadline 2.0.0が問題なのでひとつ前のバージョンを利用する様にすれば現象を回避することができます。
次のコマンドでPSReadline 1.2を追加インストールしてからPowerShell Coreを再起動するとPSReadline 1.2を先にロードする様になりこの問題を回避できます。
# PSReadline 1.2を追加インストール後、コンソールを再起動 Install-Module PSReadLine -Scope CurrentUser -RequiredVersion 1.2 -Force -SkipPublisherCheck
2. 最新ビルドのPSReadline 2.0.0を使用する
PSReadlineの最新ビルドではコードページの強制に対して以下の修正が入っています。
この修正自体は別件に対する対応と思われるのですが、コードページの変更を強制しなくなるため本件の対応としても有用です。
ただし、この修正が適用されたPSReadlineはまだリリースされていません。
(おそらくPSReadline 2.0.0-beta.4に含まれるでしょう...)
このため手っ取り早い方法としてはPSReadineの最新ビルドをインストールしてやるのが良いでしょう。
以下にざっくりとですが手順を記載しておきます。
AppVeyor上の最新ビルドから最新のビルド(Zipファイル)をダウンロードします。
Zipファイルを展開し、展開した内容を
[マイドキュメント]\PowerShell\Modules\PSReadLine\2.0.0
に保存します。
(上図の構成になる様にしてください)
これで最新のPSReadlineがロードされ問題を回避することができます。