【入門編】【POSIX風コマンドライン引数パーサー】ロングオプション(–)とショートオプション(-)を解析するフラグパーサー – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは! VBScriptの世界へようこそ。
業務自動化の現場で、Excelマクロの限界にぶつかったり、「ちょっとしたバッチ処理をWindows環境でサクッと動かしたい」と思ったとき、頼りになるのがWSH(Windows Script Host)とVBScriptですね。

今回は、VBScriptの基本をマスターしたあなたへ、ワンランク上の実用テクニックをお届けします。
テーマは「POSIX風コマンドライン引数パーサー」です。

Linuxのコマンドで見かける `–config=settings.ini` や `-v` のようなスマートなオプション指定を、VBScriptでも実現してみましょう。ここをクリアすれば、あなたのスクリプトは「ただの自動化ツール」から「洗練されたプロフェッショナルなツール」へと生まれ変わります。一緒にマスターしていきましょう!

なぜVBScriptでコマンドライン引数を解析するのか?

VBScriptで引数を受け取る場合、標準では `WScript.Arguments` を使います。しかし、これはただスペース区切りで順番に値が並んでいるだけの「無名引数(位置引数)」です。

「第1引数はファイルパス、第2引数はフラグ、第3引数は……」と順番に依存していると、引数の数が多くなったときに破綻しますし、何よりメンテナンスが地獄になります。

そこで、Linuxのコマンドのように、

  • ロングオプション: `–config=settings.ini` や `–verbose`
  • ショートオプション: `-v` や `-o out.txt`

といった形式を柔軟に解釈し、プログラム側で扱いやすい「連想配列(Dictionary)」に変換するパーサー(解析器)を自作してみましょう。

全体像:POSIX風引数パーサーの完全コード

まずは、実際の現場でそのままコピペして使える実用コードを提示します。メモ帳に貼り付けて `parser.vbs` と名付け、コマンドプロンプトから実行してみてください。

‘ ==============================================================================
‘ スクリプト名: posix_parser.vbs
‘ 概要: Linuxコマンド風のロングオプション(–)とショートオプション(-)を解析するパーサー
‘ ==============================================================================

Option Explicit

‘ 実行例のテスト用として、WScript.Argumentsの代わりにダミー引数を使うことも可能です。
‘ 今回は実際のWScript.Argumentsをパースする関数を定義します。

Dim config
Set config = ParseArguments()

‘ — 解析結果の確認 —
WScript.Echo “=== 引数解析結果 ===”
WScript.Echo “Verbose モード: ” & config.Item(“verbose”)
WScript.Echo “設定ファイル: ” & config.Item(“config”)
WScript.Echo “出力先: ” & config.Item(“output”)

‘ ==============================================================================
‘ 関数名: ParseArguments
‘ 目的: WScript.Argumentsを走査し、POSIX風オプションをDictionaryに格納して返す
‘ ==============================================================================
Function ParseArguments()
Dim args, dict
Set args = WScript.Arguments
Set dict = CreateObject(“Scripting.Dictionary”)

‘ 1. デフォルト値の定義(ここにデフォルトの振る舞いを書くのがプロの技)
dict.Add “verbose”, False
dict.Add “config”, “default.ini”
dict.Add “output”, “result.txt”

Dim i, arg, eqPos, optName, optVal
i = 0
Do While i < args.Count arg = args(i) ' パターンA: ロングオプション (-- から始まる) If Left(arg, 2) = "--" Then arg = Mid(arg, 3) ' 先頭の "--" を削る eqPos = InStr(arg, "=") If eqPos > 0 Then
‘ 例: –config=settings.ini の場合
optName = Left(arg, eqPos – 1)
optVal = Mid(arg, eqPos + 1)
dict.Item(optName) = optVal
Else
‘ 例: –verbose の場合(フラグとしてTrueを設定)
dict.Item(arg) = True
End If

‘ パターンB: ショートオプション (- から始まる)
ElseIf Left(arg, 1) = “-” And Len(arg) > 1 Then
optName = Mid(arg, 2, 1) ‘ 1文字目を抽出(例: -v なら v)

‘ ショートオプションに値が続く場合(例: -o output.txt)
‘ 次の引数が存在し、それがハイフンで始まらない場合は値とみなす
If i + 1 < args.Count Then If Left(args(i + 1), 1) <> “-” Then
dict.Item(optName) = args(i + 1)
i = i + 1 ‘ 値として消費した分を進める
Else
dict.Item(optName) = True
End If
Else
dict.Item(optName) = True
End If

Else
‘ パターンC: オプションに属さない単体の引数(必要に応じて独自拡張可能)
‘ 今回はシンプルに無視、または別管理にする
End If

i = i + 1
Loop

Set ParseArguments = dict
End Function

コードの核心:ここがVBScriptエンジニアの腕の見せ所

上記のコードで使われている、VBScriptならではの重要なポイントと、現場でハマりがちな罠を解説します。

1. `Option Explicit` はエンジニアの良心

VBScriptでは変数の宣言なしで値を入れること(暗黙の宣言)ができてしまいますが、大規模なスクリプトではバグの温床になります。先頭に必ず `Option Explicit` を書き、変数は必ず `Dim` で宣言する習慣をつけましょう。

2. 連想配列 `Scripting.Dictionary` の威力

VBScriptでデータをキーと値のペアで管理する場合、`Scripting.Dictionary` オブジェクトが最強のパートナーになります。

Set dict = CreateObject(“Scripting.Dictionary”)
dict.Add “verbose”, False ‘ 追加
dict.Item(“verbose”) = True ‘ 上書き(存在しない場合は新規追加)

この柔軟性があるからこそ、「デフォルト値を設定しておき、コマンドラインから指定があった上書きする」というモダンなCLI挙動が簡単に実装できるのです。

3. 文字列操作関数の使い分け

  • `Left(str, n)`: 左から $n$ 文字取得(`–` や `-` の判定に使用)
  • `Mid(str, start, [length])`: 任意の場所から文字列を切り出し(プレフィックスの除去に使用)
  • `InStr(str, subStr)`: 文字列内の位置を検索(`–config=value` の `=` の位置を特定するのに必須)

これらを組み合わせることで、複雑な正規表現を使わなくても、高速で堅牢なパーサーが作れます。

実際にコマンドプロンプトから動かしてみよう

作成したスクリプトを、コマンドプロンプトから次のように叩いてみてください。

cscript //nologo posix_parser.vbs –config=production.ini –verbose -o log.txt

実行結果:

=== 引数解析結果 ===
Verbose モード: True
設定ファイル: production.ini
出力先: log.txt

見事にコマンドラインからの指示がパースされ、プログラム内部の変数(連想配列)に反映されました!

陥りやすいエラーと注意点

初心者がこの領域に踏み込んだとき、よく直面する罠をいくつかシェアしておきます。

1. `WScript.Echo` と `MsgBox` の使い分け
WSH環境(`cscript.exe`)で実行する場合、`WScript.Echo` はコンソールに標準出力されますが、GUI環境(`wscript.exe`)で実行するとポップアップメッセージボックスになります。CUIツールとして割り切るなら、必ず `cscript` コマンド経由で実行するよう運用ルールを定めましょう。
2. インデックスの暴走 (`Index Out of Bounds`)
ショートオプションの値を取る際に `args(i + 1)` を参照しますが、最後の引数の後ろを見てしまわないよう、`i + 1 < args.Count` のガード条件を入れ忘れると実行時エラーになります。上記のコードでは完璧に対策済みです。 ---

おわりに:ここをクリアすれば、VBScriptの基本はバッチリ!

お疲れ様でした! 今回は「POSIX風コマンドライン引数パーサー」という、一歩進んだ実用的なテーマを通じて、文字列操作、制御構文、オブジェクトの活用法を解説しました。

ここをスムーズに理解できたあなたなら、もうVBScriptの初学者ではありません。Windowsの自動化スクリプト職人として、現場で頼られる存在になっているはずです。

業務をラクにするためのツール作り、ぜひ楽しんでくださいね。それでは、次のステップでお会いしましょう!

タイトルとURLをコピーしました