しばたテックブログ

気分で書いている技術ブログです。

PowerShellで全角文字を入力すると表示がおかしくなる問題について の補足

本日サポートチームのブログブログ(という名のフォーラム)で以下のエントリが公開されました。

social.technet.microsoft.com

こちらについて、内容は間違ってはいないものの若干説明が雑だと思ったので本ブログで改めて説明してみます。

発生している問題

サポートブログでの説明にある通り、PowerShellコンソール上で""''で囲まれたPowerShellの文字列に日本語が混じっている際に""''を除去すると文字の描画とキャレット位置が狂ってしまう現象が発生します。

言葉で説明するより以下のGifを見てもらう方がイメージは掴みやすいかと思います。

f:id:stknohg:20181114191648g:plain

原因

こちらもサポートブログの説明の通りPSReadlineの不具合によるものです。

PSReadlineについて

github.com

PSReadlineは元々GNU Readlineに影響を受けて作られたオープンソースのソフトウェアで、PowerShellコンソールに対してシンタックスハイライトやキーバインドのカスタマイズ等といった機能強化をするためのモジュールになります。

このモジュールはWindows 10およびWindows Server 2016からOSに標準搭載される様になっているためサポートブログでの対象OSがWindows 10およびWindows Server 2016となっています。

本件に関連するIssue

PSReadlineはオープンソースでGitHubでIssue管理されています。
本件に関連すると思しきものは以下の2件あり、2015年にはすでに問題が出ていた様です。

最初のIssueはPSReadline 1.0.0.13で報告されており、厳密に対象バージョンを特定できていないのですが、私の知る限りではPSReadline 1.x系は全滅の様です。

そしてIssueを最後まで読むとわかるのですがPSReadline 2.0.0(現在はBeta.3が最新)ではこの問題は解消されています。

対象OS

PSReadlineはWindows 10やWindows Server 2016以外のOSでも追加インストールすることが可能です。
原因がPSReadlineにあるため本現象が発生するのはOSを問わずPSReadline 1.x系を使っている環境全般のハズです。

また、Windows 10以降のOSにおいてはそのバージョンによってインストールされているPSReadlineのバージョンが異なります。

以下にOSバージョンごとにインストールされているPSReadlineを列挙していきます。
この中でPSReadline 1.xを使用している環境が問題になります。

Windows 10

リリース PowerShell PSReadline 対象
Windows 10 初期リリース (1507) 5.0 1.1 ×
Windows 10 November Update (1511) 5.0 1.1 ×
Windows 10 Anniversary Update (1607) 5.1 1.2 ×
Windows 10 Creators Update (1703) 5.1 1.2 ×
Windows 10 Fall Creators Update (1709) 5.1 1.2 ×
Windows 10 April 2018 Update (1803) 5.1 1.2 ×
Windows 10 October 2018 Update (1809) 5.1 2.0.0-beta.2
Windows 10 May 2019 Update (1903) 5.1 2.0.0-beta.2
Windows 10 November 2019 Update (1909) 5.1 2.0.0-beta.2
Windows 10 May 2020 Update (2004) 5.1 2.0.0-beta.2
Windows 10 October 2020 Update(20H2) 5.1 2.0.0-beta.2
Windows 10 May 2021 Update(21H1) 5.1 2.0.0-beta.2

Windows Server

リリース PowerShell PSReadline 対象
Windows Server 2016 5.1 1.2 ×
Windows Server 2019 5.1 2.0.0-beta.2

【補足】PowerShell Core および PowerShell 7

こちらは補足ですがPowerShell Coreに同梱されているPSReadlineは以下の通りとなります。

バージョン PSReadline 対象
6.0.x 1.2 ×
6.1.x 2.0.0-beta.3
6.2.x 2.0.0-beta.3
7.0.0-rc.x 2.0.0-rc.2
7.0.0 - 7.0.2 2.0.0
7.0.3 2.0.2
7.1.x 2.1.0
7.2.0 2.1.0

対処方法

対処方法は正確には2つ存在します。

1. PSReadlineを使用しない

こちらはサポートブログにある通りの対処方法です。
Remove-Moduleを使えばモジュールをアンロードできますのでこの不具合も起きなくなります。

Remove-Module PSReadline

ただし、この変更は永続化されませんので変更を永続化したいときは上記コードをプロファイルに仕込むと良いでしょう。

2. PSReadline 2.0.0をインストールする

もう一つの対処方法です。
原因はPSReadline 1.xにあるのでPSReadlineのバージョンを上げてしまえば問題を回避できます。

ただし、最新OSで既に導入済みであるもののPSReadline 2.0.0はまだベータ版です。
ベータ版のモジュールを追加でインストールするためにはモジュールの管理基盤であるPowerShellGetの更新も同時に必要であり、この対処を行うのは少し敷居が高いかもしれません。

本ブログの

blog.shibata.tech

でPowerShellGetとPSReadlineの更新方法を記載していますので詳しい手順についてはこちらをご覧ください。

【補足】PSReadline 2.0.0の注意点

本件とは直接関係しないのですが、Windows 10以前のOSにPSReadline 2.0.0をインストールする場合は以下の問題がありますので注意してください。

blog.shibata.tech