バッチファイルのECHOの文字に色付け

Windowsを使っていると、現在でもバッチファイルを使うことは多々あります。バッチファイルでは、ECHOコマンドでコンソールに文字列を出力します。この文字列に色付けする方法についての投稿です。

コンソールの文字列に色付けをするにあたって、まずはASCIIコードについて確認します。

ASCIIコード

文字を出力するときは、ASCIIコードなどの文字コードで文字を指定します。文字を指定するときの文字コードは通常0x20(十進数で32)以上の値が使われます。

ASCIIコードの印字可能文字である0x20から0x7f (十進数で32から127)の対応表は以下の通りです。

文字|文字|文字|文字
0x20 (32)SPC
(空白文字)
|0x38 (56)8|0x50 (80)P|0x68 (104)h
0x21 (33)!|0x39 (57)9|0x51 (81)Q|0x69 (105)i
0x22 (34)|0x3a (58):|0x52 (82)R|0x6a (106)j
0x23 (35)#|0x3b (59);|0x53 (83)S|0x6b (107)k
0x24 (36)$|0x3c (60)<|0x54 (84)T|0x6c (108)l
0x25 (37)%|0x3d (61)=|0x55 (85)U|0x6d (109)m
0x26 (38)&|0x3e (62)>|0x56 (86)V|0x6e (110)n
0x27 (39)|0x3f (63)?|0x57 (87)W|0x6f (111)o
0x28 (40)(|0x40 (64)@|0x58 (88)X|0x70 (112)p
0x29 (41))|0x41 (65)A|0x59 (89)Y|0x71 (113)q
0x2a (42)*|0x42 (66)B|0x5a (90)Z|0x72 (114)r
0x2b (43)+|0x43 (67)C|0x5b (91)[|0x73 (115)s
0x2c (44),|0x44 (68)D|0x5c (92)\|0x74 (116)t
0x2d (45)|0x45 (69)E|0x5d (93)]|0x75 (117)u
0x2e (46).|0x46 (70)F|0x5e (94)^|0x76 (118)v
0x2f (47)/|0x47 (71)G|0x5f (95)_|0x77 (119)w
0x30 (48)0|0x48 (72)H|0x60 (96)`|0x78 (120)x
0x31 (49)1|0x49 (73)I|0x61 (97)a|0x79 (121)y
0x32 (50)2|0x4a (74)J|0x62 (98)b|0x7a (122)z
0x33 (51)3|0x4b (75)K||0x63 (99)c|0x7b (123){
0x34 (52)4|0x4c (76)L|0x64 (100)d|0x7c (124)|
0x35 (53)5|0x4d (77)M|0x65 (101)e|0x7d (125)}
0x36 (54)6|0x4e (78)N|0x66 (102)f|0x7e (126)~
0x37 (55)7|0x4f (79)O|0x67 (103)g|
ASCIIコード表 (印字可能文字、0x20から0x7e)

画面上に直接表示できる文字(印字可能文字)は、文字として入力するため、実際に文字コードを指定することはほとんどありません。

ASCIIコードは、直接表示できる文字(印字可能文字)以外にコントロールコード(制御文字)も存在します。0x00から0x1f (十進数で0から31)および0x7f (127)です。

キャレット
記法 (CS)
略語 / 意味|
|
キャレット
記法 (CS)
略語 / 意味
0x00 (0)^@NUL (null文字)|0x10 (16)^PDLE (伝送制御拡張)
0x01 (1)^ASOH (ヘッディング開始)|0x11 (17)^QDC1 (装置制御1, XON)
0x02 (2)^BSTX (テキスト開始)|0x12 (18)^RDC2 (装置制御2)
0x03 (3)^CETX (テキスト終了)|0x13 (19)^SDC3 (装置制御3, XOFF)
0x04 (4)^DEOT (伝送終了)|0x14 (20)^TDC4 (装置制御4)
0x05 (5)^EENG (照会)|0x15 (21)^UNAK (否定応答)
0x06 (6)^FACK (肯定応答)|0x16 (22)^VSYN (同期)
0x07 (7)^GBEL (警告)|0x17 (23)^WETB (伝送ブロック終了)
0x08 (8)^HBS (後退)|0x18 (24)^XCAN (キャンセル)
0x09 (9)^IHT (水平タブ)|0x19 (25)^YEM (メディア終端)
0x0a (10)^JLF (改行)|0x1a (26)^ZSUB (置換)
0x0b (11)^KVT (垂直タブ)|0x1b (27)^[ESC (エスケープ)
0x0c (12)^LFF (改頁)|0x1c (28)^\FS (フォーム区切り)
0x0d (13)^MCR (復帰)|0x1d (29)^]GS (グループ区切り)
0x0e (14)^NSO (シフトアウト)|0x1e (30)^^RS (レコード区切り)
0x0f (15)^OSI (シフトイン)|0x1f (31)^_US (ユニット区切り)
|0x7f (127)^?DEL (削除)
ASCIIコード表 (制御文字, 0x00から0x1f, 0x7e)

これらの制御文字は表示するための文字ではなく、モニタやプリンタなどの機器を制御するために用いられます。例えば、ASCII 10(10進)は line feed(改行)を表しプリンタの紙送りなどに用います。ASCII 27(10進) はエスケープを表します。

また、制御文字の多くは、コンピューターの黎明期に使われたデータ転送プロトコルやデバイスを制御するるために定義されました。

  • データ転送プロトコルの例:ヘッディング開始、テキスト開始、テキスト終了など
  • 磁気テープの例:セパレータ(区切り)は磁気テープへの保存のため
  • プリンタやモデムの例:XON や XOFF は、プリンタのような処理の遅いデバイスにおいて、データを失うことがないように情報の流れを制御するため

エスケープシーケンスで色付け

文字に色付けするためには、ASCIIコードの値が0x1b (27)であるESC (エスケープ)を利用します。

構文としては以下の通りとなります。

ESC[{code1;code2;...}m

code1,code2, … のcodeNには、色やスタイルの指定となります。複数指定するときは、セミコロン’;’で区切ります。

上記の構文の'{‘や’}’は便宜上コードをグループ化するために記載しているだけで、実際に指定するときは必要ありません。

実際の指定では、下記のようになります

ESC[31;44m

この例は、青背景に赤色文字の指定となります。

CodeNに指定できるコードには色としては以下になります。

文字色の
コード
背景色の
コード
|文字色の
コード
背景色の
コード
3040|灰色90100
3141|明るい赤91101
3242|明るい緑92102
黄色3343|明るい黄色93103
3444|明るい青94104
マゼンダ3545|明るいマゼンダ95105
シアン3646|明るいシアン96106
3747|明るい白97107
RGB色 (rgb)38;2;r;g;b48;2;r;g;b|
インデックス色(s)38;5;s48;5;s|
色をリセット。
色を標準に戻す
3949
文字色と背景色のコード

また、文字色は背景色以外に、装飾も指定できます。装飾のコードは以下の通りです。

装飾コード機能
0オールリセット。すべての属性を未設定状態に戻す (0は省略可能)
1太字・明るい(ボールド・ブライト)
2薄く表示
22太字・明るい(ボールド・ブライト)、および、薄くをリセット
3斜体(イタリック)
23斜体(イタリック)をリセット
4下線(アンダーライン)
24下線(アンダーライン)をリセット
5点滅
25点滅、および、高速点滅をリセット
6高速点滅
7文字色と背景色の反転
27文字色と背景色の反転をリセット
8表示を隠す(コピペ可能)
28表示を隠すをリセット
9取り消し線
29取り消し線をリセット
文字色と装飾のコード

色コードや装飾コードは同時に複数指定することもできます。たとえば、

あいうえお

のように、文字色を赤色(31)、背景色をシアン(46)とし、さらに、下線をつけて「あいうえお」と表示し、最後に属性をリセットする場合は以下の通りとなります。

ESC[31;46;4mあいうえおESC[0m

リセットコードの0は省略できるため、上記は下記のように短く表記することもできます。

ESC[31;46;4mあいうえおESC[m

エスケープシーケンスで画面制御

同じ仕組みを使ってカーソルの制御や画面の制御もできます。

書式略称Description機能
ESC[nACUUCursor Upカーソルの位置をn上に移動する
ESC[nBCUDCursor Downカーソルの位置をn下に移動する
ESC[nCCUFCursor Forwardカーソルの位置をn右に移動する
ESC[nDCUBCursor Backwardカーソルの位置をn左に移動する
ESC[nECNLCursor Next Lineカーソルの位置をn行下に移動する
ESC[nFCPLCursor Previous Lineカーソルの位置をn行上に移動する
ESC[nGCHACursor Horizontal Absoluteカーソルの位置を現在の行中のn番目に移動する
ESC[ndVPAVertical Line Position Absoluteカーソルの位置を現在の行中のn番目に移動する
ESC[y;xHCUPCursor Positionカーソルの位置をY行X列に移動する
ESC[y;xfHVPHorizontal Vertical Positionカーソルの位置をY行X列に移動する
ESC[sANSISYSSCSave Cursor – Ansi.sys emulationカーソルの位置を記憶する
ESC[uANSISYSRCRestore Cursor – Ansi.sys emulation記憶していたカーソルの位置に戻す
ESC[?12hATT160Text Cursor Enable Blinkingカーソルの点滅を開始する
ESC[?12lATT160Text Cursor Disable Blinkingカーソルの点滅を停止する
ESC[?25hDECTCEMText Cursor Enable Mode Showカーソルを表示にする
ESC[?25lDECTCEMText Cursor Enable Mode Hideカーソルを非表示にする
ESC[JEDErase in Displayカーソル位置から画面の最後までクリア
ESC[1JEDErase in Display画面の先頭からカーソル位置までクリア
ESC[2JEDErase in Display画面をクリア
ESC[KELErase in Lineカーソル位置から行末迄をクリア
ESC[1KELErase in Line行頭からカーソル位置までをクリア
ESC[2KELErase in Lineカーソル位置の行をクリア
画面制御のコード

各エスケープシーケンスの詳細は、マイクロソフトのサイトにあります。詳細を知りたい場合は、以下を参照してください。

Console Virtual Terminal Sequences
https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

コマンドプロンプトのECHOで色付け

バッチファイルは、コマンドプロンプト(cmd.exe)上で実行されます。まずは、コマンドプロンプト上で直接ECHOコマンドを実行したときの色付け方法を確認します。

echo ^[[31mあいうえお^[[0m

この例では、文字色を赤色(^[31m)にし、文字列「あいうえお」を表示し、最後に装飾の属性をリセット(^[0m)しています。

^[は、制御文字のESC(エスケープ)であり、コマンドプロンプト上では、「Ctrl + [」で入力します。

バッチファイル内のECHOで色付け

バッチファイルでもコマンドプロンプトと同様にエスケープシーケンスを使って色付けができます。

ただし、制御文字ESCの0x1b (27) の入力方法がバッチファイルを編集するテキストエディターに依存します。テキストエディターが制御文字ESCの0x1b (27)を入力する方法が提供されている場合は、それを使って制御文字ESCの入力すればよいです。

しかし、テキストエディターに依存せず制御文字ESCを扱う方法もあります。環境変数に制御文字をセットし、制御文字ESCが必要なところでは、環境変数を参照します。

まず、環境変数に制御文字を設定します。その方法には以下のコードを利用します。このコードを利用すると、環境変数名ESCに制御文字ESCが設定されます。

FOR /f %%i IN ('cmd /k prompt $e^<nul') DO SET ESC=%%i

このコードをバッチファイル内で、制御文字ESCが必要になる前までに、一回実行します。

実際に制御文字が必要な個所では、下記のように利用します。

echo %ESC%[31mあいうえお%ESC%[0m

このように、バッチファイルの編集に使用するテキストエディターに依存せず、バッチファイル内で制御文字ESCを利用できます。


以上、今回の投稿では、バッチファイル内のECHOなどで文字列を色付けする方法について説明しました。

コメントを残す