Windows
command

WindowsコマンドプロンプトでのANSIエスケープシーケンスの使用


概要

ANSIエスケープシーケンスは,端末上でテキストをカラー表示したり,点滅表示したり,表示位置を制御したりするときに利用されてきた端末の機能です。エスケープ記号(\x1b)に続く一定の文法に即した文字の並びによって,そうした制御を実現することが可能になっています。Linuxの ls コマンドは,ディレクトリやファイルの区別やファイルモードによってファイル名の表示色を変えていますが,表示色の変更にはこのANSIエスケープシーケンスが使われています。所定の文字の並びを標準出力に出力するだけでカラー表示が実現できますので,スクリプトなどで目視のために何かを強調出力するようなときにはとてもお手軽で重宝します。ANSIエスケープシーケンスの具体的な文字の並びは文献[Wikipedia][PruneMazui]あたりを参照してください。

MS-DOSではこのANSIエスケープシーケンスが使えるようになっていたのですが,Windowsになってからサポートしなくなってしまいました。しかし,本稿で紹介する ansicon [ansicon]を利用すれば,そういった環境でもエスケープシーケンスを利用したカラー表示ができるようになります。

:warning: 文献[stknohg]によると,Windows 10 の Anniversary Update(1607) 以降のコマンドプロンプトでは,標準でANSIエスケープシーケンスがサポートしているようです。ansicon の出番は今後なくなりそうですが,会社などでは依然,Windows 7などの少し古いOSを使い続けているようなことがよくあります。そういった環境では,いまだ利用価値のあるツールと言えます。


ansicon のインストール

このリンクからダウンロードした ansi188-bin.zip を展開します。展開して得られるディレクトリ中のx64ディレクトリ(64bit版Windows使用時),またはx32ディレクトリ(32bit版Windows使用時)の内容を適当なPATHの通ったディレクトリにコピーします。


ansicon の都度有効化

毎回,コマンドを実行するたびにANSIエスケープシーケンスを有効にしたい場合,以下のように ansicon からコマンドを実行します。

ansicon コマンドライン

ansicon python hoge.py


コマンドプロンプト起動時の ansicon 有効化

コマンドプロンプト起動時にANSIエスケープシーケンスを有効化する場合,以下のコマンドを実行します。このコマンドを実行することで,レジストリ \HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRunansicon の実行が登録されます。

ansicon -i

コマンド起動時のANSICON有効化を解除する場合は,以下のコマンドを実行します。

ansicon -u

ただし,コマンドラインから直接スクリプトを実行する場合,この方法ではANSIエスケープシーケンスは有効化されません。

コマンドラインから直接スクリプトを実行するときでもANSIシーケンスを有効化したい場合,拡張子の実行内容で ansicon の実行を指定する方法があります。以下の例では,Pythonのスクリプトを実行する場合は,常にansiconを実行するように設定しています。(ansiconC:\WINAPP\bin に,python.exeC:\WINAPP\Python にインストールされているものとします。)拡張子に対するファイルタイプやコマンドの紐付けがすでにされている場合はそれらが変わってしまうため注意してください。

assoc .py=Python.File

ftype Python.File="C:\WINAPP\bin\ansicon.exe" "C:\WINAPP\Python\python.exe" "%L" %*

解除したい場合は以下のようにします。

ftype Python.File=


ansicon 利用時の問題

ansicon を起動していると一部のアプリケーションでは不具合がでる場合があります。確認されている範囲で以下のアプリケーションが該当します。


  • sqlite3


参考文献

[Wikipedia] Wikipedia, "ANSI escape code"(読み込まないとわかりにくいです。)

[PruneMazui] PruneMazui, "ANSIエスケープシーケンス チートシート" (qiita)

[ansicon] Jason Hood, "ANSICON"

[stknohg] stknohg, "しばたテックブログ: PowerShellでwttr.inを表示してみる"