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コードは、直接表示できる文字(印字可能文字)以外にコントロールコード(制御文字)も存在します。0x00から0x1f (十進数で0から31)および0x7f (127)です。
値 | キャレット 記法 (CS) | 略語 / 意味 | | | | 値 | キャレット 記法 (CS) | 略語 / 意味 |
---|---|---|---|---|---|---|
0x00 (0) | ^@ | NUL (null文字) | | | 0x10 (16) | ^P | DLE (伝送制御拡張) |
0x01 (1) | ^A | SOH (ヘッディング開始) | | | 0x11 (17) | ^Q | DC1 (装置制御1, XON) |
0x02 (2) | ^B | STX (テキスト開始) | | | 0x12 (18) | ^R | DC2 (装置制御2) |
0x03 (3) | ^C | ETX (テキスト終了) | | | 0x13 (19) | ^S | DC3 (装置制御3, XOFF) |
0x04 (4) | ^D | EOT (伝送終了) | | | 0x14 (20) | ^T | DC4 (装置制御4) |
0x05 (5) | ^E | ENG (照会) | | | 0x15 (21) | ^U | NAK (否定応答) |
0x06 (6) | ^F | ACK (肯定応答) | | | 0x16 (22) | ^V | SYN (同期) |
0x07 (7) | ^G | BEL (警告) | | | 0x17 (23) | ^W | ETB (伝送ブロック終了) |
0x08 (8) | ^H | BS (後退) | | | 0x18 (24) | ^X | CAN (キャンセル) |
0x09 (9) | ^I | HT (水平タブ) | | | 0x19 (25) | ^Y | EM (メディア終端) |
0x0a (10) | ^J | LF (改行) | | | 0x1a (26) | ^Z | SUB (置換) |
0x0b (11) | ^K | VT (垂直タブ) | | | 0x1b (27) | ^[ | ESC (エスケープ) |
0x0c (12) | ^L | FF (改頁) | | | 0x1c (28) | ^\ | FS (フォーム区切り) |
0x0d (13) | ^M | CR (復帰) | | | 0x1d (29) | ^] | GS (グループ区切り) |
0x0e (14) | ^N | SO (シフトアウト) | | | 0x1e (30) | ^^ | RS (レコード区切り) |
0x0f (15) | ^O | SI (シフトイン) | | | 0x1f (31) | ^_ | US (ユニット区切り) |
| | 0x7f (127) | ^? | DEL (削除) |
これらの制御文字は表示するための文字ではなく、モニタやプリンタなどの機器を制御するために用いられます。例えば、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に指定できるコードには色としては以下になります。
色 | 文字色の コード | 背景色の コード | | | 色 | 文字色の コード | 背景色の コード |
---|---|---|---|---|---|---|
黒 | 30 | 40 | | | 灰色 | 90 | 100 |
赤 | 31 | 41 | | | 明るい赤 | 91 | 101 |
緑 | 32 | 42 | | | 明るい緑 | 92 | 102 |
黄色 | 33 | 43 | | | 明るい黄色 | 93 | 103 |
青 | 34 | 44 | | | 明るい青 | 94 | 104 |
マゼンダ | 35 | 45 | | | 明るいマゼンダ | 95 | 105 |
シアン | 36 | 46 | | | 明るいシアン | 96 | 106 |
白 | 37 | 47 | | | 明るい白 | 97 | 107 |
RGB色 (rgb) | 38;2;r;g;b | 48;2;r;g;b | | | |||
インデックス色(s) | 38;5;s | 48;5;s | | | |||
色をリセット。 色を標準に戻す | 39 | 49 | ❘ |
また、文字色は背景色以外に、装飾も指定できます。装飾のコードは以下の通りです。
装飾コード | 機能 |
---|---|
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[nA | CUU | Cursor Up | カーソルの位置をn上に移動する |
ESC[nB | CUD | Cursor Down | カーソルの位置をn下に移動する |
ESC[nC | CUF | Cursor Forward | カーソルの位置をn右に移動する |
ESC[nD | CUB | Cursor Backward | カーソルの位置をn左に移動する |
ESC[nE | CNL | Cursor Next Line | カーソルの位置をn行下に移動する |
ESC[nF | CPL | Cursor Previous Line | カーソルの位置をn行上に移動する |
ESC[nG | CHA | Cursor Horizontal Absolute | カーソルの位置を現在の行中のn番目に移動する |
ESC[nd | VPA | Vertical Line Position Absolute | カーソルの位置を現在の行中のn番目に移動する |
ESC[y;xH | CUP | Cursor Position | カーソルの位置をY行X列に移動する |
ESC[y;xf | HVP | Horizontal Vertical Position | カーソルの位置をY行X列に移動する |
ESC[s | ANSISYSSC | Save Cursor – Ansi.sys emulation | カーソルの位置を記憶する |
ESC[u | ANSISYSRC | Restore Cursor – Ansi.sys emulation | 記憶していたカーソルの位置に戻す |
ESC[?12h | ATT160 | Text Cursor Enable Blinking | カーソルの点滅を開始する |
ESC[?12l | ATT160 | Text Cursor Disable Blinking | カーソルの点滅を停止する |
ESC[?25h | DECTCEM | Text Cursor Enable Mode Show | カーソルを表示にする |
ESC[?25l | DECTCEM | Text Cursor Enable Mode Hide | カーソルを非表示にする |
ESC[J | ED | Erase in Display | カーソル位置から画面の最後までクリア |
ESC[1J | ED | Erase in Display | 画面の先頭からカーソル位置までクリア |
ESC[2J | ED | Erase in Display | 画面をクリア |
ESC[K | EL | Erase in Line | カーソル位置から行末迄をクリア |
ESC[1K | EL | Erase in Line | 行頭からカーソル位置までをクリア |
ESC[2K | EL | Erase 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などで文字列を色付けする方法について説明しました。