VBScriptでCLIの美学を。全角・半角混在の「ズレ」を完全に制御するPadding技術
こんにちは。自動化の現場でVBScriptと長年向き合ってきた、あなたの技術的伴走者です。
VBScriptで`WScript.Echo`を使ってコンソールにログを出力するとき、こんな経験はありませんか?
「文字数を揃えたはずなのに、全角文字が混じると列がガタガタに崩れる……」
これは、VBScriptが文字数(Length)を「文字の個数」として数える一方で、コンソールの表示幅は「全角=2、半角=1」という物理的な占有幅で決まるからです。この「論理と物理の乖離」を埋めない限り、どれだけスペースを詰めても美しいCLI(コマンドラインインターフェース)は作れません。
今日は、プロの現場でもそのまま使える「文字幅を正確に計算するPadding関数」の作り方を伝授します。ここをクリアすれば、あなたはもう「動くだけのスクリプト」から「洗練されたツール」を作れるエンジニアの仲間入りです。
—
なぜ「文字数」だけではダメなのか?
VBScriptの `Len()` 関数は、文字列の長さを「文字の数」で返します。
- 「ABC」(半角3文字)→ `Len` は 3
- 「あいう」(全角3文字)→ `Len` は 3
しかし、コンソール上では「ABC」は3マス、「あいう」は6マス分を占有します。この差を補正するためには、「その文字列がコンソールで何マス分占有するか」を計算する独自のロジックが必要です。
—
核心:全角・半角判定ロジックの構築
まずは、対象の文字列が「何マス分を消費するのか」を算出する関数から作りましょう。VBScriptでは、バイト数を利用して判別するのが最も確実で高速です。
‘ 文字列の表示幅(全角=2, 半角=1)を算出する関数
Function GetDisplayWidth(strText)
Dim i, charCode, totalWidth
totalWidth = 0
For i = 1 To Len(strText)
‘ 1文字ずつ取り出してAscBで判定する
‘ ASCコードが128より大きければ全角とみなす(Shift-JIS環境の鉄則)
If Asc(Mid(strText, i, 1)) < 0 Or Asc(Mid(strText, i, 1)) > 255 Then
totalWidth = totalWidth + 2
Else
totalWidth = totalWidth + 1
End If
Next
GetDisplayWidth = totalWidth
End Function
コードの解説
- `Mid(strText, i, 1)`: 文字列を1文字ずつ分解します。
- `Asc(…)`: 文字コードを取得します。日本語環境(Shift-JIS)では、全角文字は特殊な範囲の値を返すため、これを利用して幅を判定します。
—
現場で使える「Padding関数」の実装
次に、この幅判定を使って「指定した桁数になるまでスペースで埋める」関数を作成します。
‘ 文字列を左寄せして指定幅に揃える関数
Function PadRight(strText, targetWidth)
Dim currentWidth
currentWidth = GetDisplayWidth(strText)
‘ 指定幅に足りない分だけスペースを追加
If currentWidth < targetWidth Then
PadRight = strText & Space(targetWidth - currentWidth)
Else
PadRight = strText
End If
End Function
' 使用例:ログ出力の整形
WScript.Echo PadRight("ID", 10) & " | " & "ユーザー名"
WScript.Echo PadRight("101", 10) & " | " & "佐藤"
WScript.Echo PadRight("102", 10) & " | " & "山田太郎"
実行結果のイメージ
ID | ユーザー名
101 | 佐藤
102 | 山田太郎
このように、全角・半角が混ざっていても、`|` の位置がピタリと揃います。これが美しいCLIの第一歩です。
—
さらに極めるための注意点
1. Shift-JISの呪縛
VBScriptは古い技術であるため、文字コードの扱いに注意が必要です。もしUTF-8で保存したスクリプトを `cscript` で動かすと、文字化けや判定ミスが起きることがあります。スクリプトファイルは「ANSI(Shift-JIS)」で保存するのが、VBScriptを安定させるための「現場の知恵」です。
2. パフォーマンスへの配慮
今回の `PadRight` は非常に軽量ですが、もし数万行のログをループで処理する場合は、`Space()` 関数を何度も呼び出すよりも、あらかじめバッファを作っておくなどの最適化が効いてきます。まずはこの関数で安定稼働を目指し、ボトルネックを感じたら最適化する。これがエンジニアの正しいステップです。
—
最後に:自動化は「細部」に宿る
「ただ動けばいい」スクリプトは初心者でも書けます。しかし、「出力結果が読みやすく、メンテナンス性が高い」スクリプトは、プロのエンジニアの証です。
今回作成した `PadRight` 関数を共通部品(.vbsファイル)として切り出しておけば、今後どんなツールを作る時にも役立つあなたの強力な武器になります。
VBScriptは古い言語と言われますが、Windows環境での小回りの良さは今もなお現役です。ぜひ、この「美学」をあなたのコードにも取り入れてみてください。応援していますよ!
