【コンソールカラー表示】CScript 環境で ANSI エスケープシーケンスを用いたターミナル出力の着色と高度な表示制御
開発現場でVBScriptを使うとき、君たちはまだ「ただの味気ない黒背景に白文字のログ」を出力しているのかい?
「処理が成功したのか、どこで警告が出ているのか、一目でわからない」
「大量のログの中からエラーを探すのに目がチカチカする」
もし業務自動化ツールやCLIバッチの運用保守で böyle(こんな)非効率に悩んでいるなら、今日でその悪習とはお別れだ。
VBScriptはレガシーな言語だと言われがちだが、Windows Script Host(WSH)の挙動とOSの仕様を完全に掌握していれば、現代のモダンなCLIツール並みに洗練されたカラフルなコンソール出力を実現できる。今回は、`CScript.exe` 環境において ANSIエスケープシーケンス を駆使し、ターミナルを劇的に視覚化する極限の知見を授けよう。
—
なぜデフォルトの VBScript 出力は使えないのか?
VBScriptで標準出力を行う場合、通常は `WScript.Echo` や `WScript.StdOut.Write` を使用する。しかし、これらは単なるテキストの流し込みに過ぎない。
実務において、数百行に及ぶログからクリティカルなエラーを瞬時に視認させるには、「色による情報の階層化」 が不可欠だ。
しかし、VBScriptには色付き出力を行うための専用メソッド(例: `Color = Red` のようなもの)は標準では存在しない。ここで多くのエンジニアが「VBScriptだから無理だ」と諦めてしまう。
だが、Windows 10 / 11 のコンソールホスト(ConHost)や Windows Terminal は、標準で ANSIエスケープシーケンス(VT100制御シーケンス) をネイティブサポートしている。つまり、適切なバイト列を標準出力に流し込むだけで、文字色、背景色、さらにはカーソル位置の制御まで自在に操れるのだ。
—
堅牢なコンソール制御を実現するための設計思想
プロダクション環境でANSIエスケープシーケンスを扱う際、以下の2点を見落とすと致命的なバグを生む。
1. WScript.Echo と StdOut の使い分け
`WScript.Echo` は末尾に自動で改行とCRLFが付与され、出力先がGUI(WScript.exe)の場合はメッセージボックスに化ける。コンソールカラーを制御してCUIツールを作るなら、必ず `CScript.exe` で実行し、`WScript.StdOut.Write`(または `WLine`)を使用すること。
2. レガシーOS(Windows 7/8)やリダイレクトへの配慮
もしログをファイルへリダイレクト(`> log.txt`)する場合、ANSIコードがそのまま文字化けしてファイルに書き込まれてしまう。実務では、「リダイレクトされているか」「カラー対応環境か」を意識した設計がプロの技だ。
—
【実践】プロダクションコード:色付きロガークラス
それでは、実際の業務でそのままコピペして使える、堅牢で拡張性の高いVBScriptコードを公開しよう。
このコードでは、エスケープシーケンスを定数化し、ログレベルに応じたカラーリングをカプセル化している。
‘ ==============================================================================
‘ File: ConsoleLogger.vbs
‘ Description: CScript環境向け ANSIエスケープシーケンス・カラーロガー
‘ Author: 業務自動化アーキテクト
‘ ==============================================================================
Option Explicit
‘ 実行環境の強制チェック(CScript以外なら警告して終了)
If InStr(LCase(WScript.FullName), “cscript.exe”) = 0 Then
MsgBox “このスクリプトは CScript.exe で実行してください。” & vbCrLf & _
“例: cscript ConsoleLogger.vbs”, vbCritical, “実行環境エラー”
WScript.Quit 1
End If
‘ ——————————————————————————
‘ ConsoleLogger クラスの定義
‘ ——————————————————————————
Class ConsoleLogger
‘ ANSIエスケープシーケンス定数
Private Const ESC = Chr(27)
‘ 文字色 (Foreground)
Public Const FG_BLACK = “30”
Public Const FG_RED = “31”
Public Const FG_GREEN = “32”
Public Const FG_YELLOW = “33”
Public Const FG_BLUE = “34”
Public Const FG_MAGENTA = “35”
Public Const FG_CYAN = “36”
Public Const FG_WHITE = “37”
Public Const FG_DEFAULT = “39”
‘ スタイル
Public Const STYLE_RESET = “0”
Public Const STYLE_BOLD = “1”
Public Const STYLE_UNDERLINE = “4”
‘ 内部メソッド: 生のANSIコードを出力
Private Sub WriteRaw(ByVal ansiCode, ByVal message)
WScript.StdOut.Write ESC & “[” & ansiCode & “m” & message & ESC & “[0m” & vbCrLf
End Sub
‘ 正常系ログ (緑)
Public Sub Info(ByVal message)
WriteRaw “1;” & FG_GREEN, “[INFO] ” & Now & ” – ” & message
End Sub
‘ 警告系ログ (黄)
Public Sub Warn(ByVal message)
WriteRaw “1;” & FG_YELLOW, “[WARNING] ” & Now & ” – ” & message
End Sub
‘ 異常系ログ (赤 + 太字)
Public Sub [Error](ByVal message)
WriteRaw “1;” & FG_RED, “[ERROR] ” & Now & ” – ” & message
End Sub
‘ ヘッダーや強調表示用 (シアン)
Public Sub Header(ByVal message)
WScript.StdOut.Write vbCrLf
WriteRaw “1;” & FG_CYAN & “;40”, “=== ” & UCase(message) & ” ===”
WScript.StdOut.Write vbCrLf
End Sub
‘ プログレス表示や動的更新用(改行なし)
Public Sub PrintProgress(ByVal message)
WScript.StdOut.Write vbCrLf & ESC & “[36m” & “>> ” & message & “…” & ESC & “[0m”
End Sub
End Class
‘ ——————————————————————————
‘ メイン処理(動作デモ)
‘ ——————————————————————————
Sub Main()
Dim logger
Set logger = New ConsoleLogger
logger.Header “Batch Process Started”
logger.Info “データベースへの接続テストを開始します。”
WScript.Sleep 600 ‘ 処理の擬似ウェイト
logger.Info “設定ファイルを正常に読み込みました (config.json)。”
WScript.Sleep 600
logger.Warn “ディスク空き容量が推奨値(20%以下)を下回っています。”
WScript.Sleep 600
logger.Error “SQL Server への接続タイムアウトが発生しました (ErrorCode: 0x80004005)。”
logger.Header “Batch Process Finished with Errors”
End Sub
‘ 実行
Main()
—
レガシーなVBScriptであっても、OSの進化や低レイヤーの仕組み(今回はANSIエスケープシーケンス)を理解していれば、ここまでモダンでメンテナンス性の高いCLIツールに生まれ変わらせることができる。
「VBScriptだからできない」ではなく、「どうすれば実現できるか」を突き詰めることこそが、真の業務自動化エンジニアの流儀だ。
今日のコードを君たちの現場のバッチに組み込み、同僚たちをアッと言わせる洗練されたログ出力を実現してくれ。
