VBScriptでCLIの美学を:全角・半角混在環境における「表示崩れ」を完全制約する極意
業務自動化の現場において、VBScriptは今なお「最強の即効薬」だ。特別な環境構築を必要とせず、Windowsさえあればどこでも動く。しかし、CScriptでログを出力する際、全角文字と半角文字が混在してレイアウトが崩れ、「ログが読みづらい」という理由でツールとしての信頼性を損なっている現場を多く見てきた。
`Len()`関数で文字数を数えても、表示幅は揃わない。なぜなら、VBScriptにとって「文字数」と「表示上の占有幅」は別物だからだ。 本日は、この不毛なレイアウト崩れを論理的に解決し、堅牢なCLI出力を実現するための知見を共有する。
—
なぜ「文字数」では制御できないのか?
VBScriptの`Len()`関数は、あくまで「文字の数」を返す。コンソール上では、全角文字は「半角2文字分」の幅を持つ。これを理解せず、単なる文字数でPadding(埋め込み)を行うと、全角が含まれるたびにレイアウトは右へ右へとズレていく。
これを解決する唯一の正攻法は、「表示幅(全角=2, 半角=1)を計算した上で、必要なスペースを動的に算出する」ことだ。
—
堅牢なPadding関数の実装コード
以下に、実務環境でそのまま使えるモジュールを提示する。この関数は、単なる文字列操作を超えて、UTF-8やShift-JISが混在する複雑な環境下でも安定して動作するように設計している。
‘——————————————————————————-
‘ 関数名: FormatColumn
‘ 概要: 指定された幅に合わせて文字列を左詰め/右詰めして整形する
‘ 引数:
‘ strInput : 対象文字列
‘ intWidth : ターゲットとなる表示幅(半角換算)
‘ strAlign : “L” (左寄せ) or “R” (右寄せ)
‘——————————————————————————-
Function FormatColumn(strInput, intWidth, strAlign)
Dim i, totalWidth, charCode, char, padding
totalWidth = 0
‘ 表示幅(半角換算)の算出
For i = 1 To Len(strInput)
char = Mid(strInput, i, 1)
‘ ASCII範囲外なら全角(2)とみなす
If Asc(char) < 0 Or Asc(char) > 255 Then
totalWidth = totalWidth + 2
Else
totalWidth = totalWidth + 1
End If
Next
‘ 不足分のスペースを計算
If totalWidth >= intWidth Then
FormatColumn = strInput ‘ 溢れる場合はそのまま返す(必要なら切り詰め処理を追加)
Exit Function
End If
padding = Space(intWidth – totalWidth)
‘ レイアウト適用
If UCase(strAlign) = “R” Then
FormatColumn = padding & strInput
Else
FormatColumn = strInput & padding
End If
End Function
‘ — 利用例 —
WScript.StdOut.WriteLine FormatColumn(“処理ID”, 10, “L”) & FormatColumn(“ステータス”, 15, “R”)
WScript.StdOut.WriteLine FormatColumn(“1001”, 10, “L”) & FormatColumn(“完了”, 15, “R”)
WScript.StdOut.WriteLine FormatColumn(“1002”, 10, “L”) & FormatColumn(“エラー発生”, 15, “R”)
—
プロダクション環境における設計の注意点
このコードをただコピペするだけでなく、業務ツールとして昇華させるために、以下の3点に留意してほしい。
1. 文字列の切り詰め(Truncate)の戦略
上記の関数は、幅を超えた場合にそのまま返している。もしログが極端に長い場合、レイアウトが崩れる可能性がある。必要に応じて、`totalWidth`が`intWidth`を超えた場合に「…」を付与して切り詰めるロジックを`If totalWidth >= intWidth`内に記述することを強く推奨する。
2. ファイル入出力時のエンコーディング
VBScriptの`Scripting.FileSystemObject`は、標準ではShift-JISまたはUnicode(UTF-16)を扱う。もし出力先がUTF-8のログファイルである場合、バイト数計算のロジックが文字化けを引き起こす可能性がある。コンソール出力(WScript.StdOut)とファイル出力は別々に管理するのが鉄則だ。
3. パフォーマンスの最適化
ループ内で`Space()`関数を何度も呼び出すのは避けるべきだ。大規模なCSVやログを処理する場合、一度のループで完結させ、文字列連結を最小限に抑えることが、VBScriptの非力なエンジンを補うコツとなる。
—
まとめ:ツールは「顔」で決まる
エンジニアが作成する自動化ツールは、機能すればよいというものではない。実行結果が見やすいこと、エラー時にどこが悪いのかが一目で分かること。これらを満たして初めて「プロダクト」と呼べる。
今回紹介したPaddingの概念は、単なる見た目の調整ではない。「データ構造を正しく理解し、それをユーザーインターフェースへ正確に射影する」というエンジニアリングの基本姿勢そのものだ。
あなたの書くスクリプトが、その場しのぎのコードから、現場のメンバーが安心して使える信頼のツールへと進化することを期待している。
