VBScriptを掌握せよ:コマンドライン引数の「型」を制して、落ちないスクリプトを書く技術
こんにちは。自動化の世界へようこそ。
現場でVBScriptを扱うエンジニアとして、多くの「動かなくなったスクリプト」を見てきました。その原因の多くは、実は非常に単純なこと——「外部から渡される値(引数)を信用しすぎたこと」にあります。
今回は、WScript.Arguments(引数)という「未知の入力」をいかに安全にさばき、スクリプトの停止を防ぐか。その極意を伝授します。
—
1. なぜ「そのまま」使ってはいけないのか?
コマンドラインからスクリプトを実行するとき、私たちはついこう書きがちです。
‘ 危険なコード例
Dim myAge
myAge = WScript.Arguments(0)
WScript.Echo “来年は” & (myAge + 1) & “歳ですね”
もし、ユーザーが数字ではなく「こんにちは」と入力したら? スクリプトは「型不一致」のエラーを吐いて無慈悲に終了します。外部からの入力はすべて「文字列(String)」としてやってくるという事実を忘れてはいけません。
—
2. 鉄壁のバリデーション・パターン
引数の妥当性をチェックし、値が空ならデフォルト値を適用する。この「守りのコード」をテンプレート化しましょう。
実装コード:安全な引数取得のテンプレート
‘ 引数のバリデーションとデフォルト値適用
Dim inputAge, safeAge
‘ 1. 引数が存在するか確認(エラー回避の基本)
If WScript.Arguments.Count > 0 Then
inputAge = WScript.Arguments(0)
Else
‘ 引数がない場合はデフォルト値を設定
inputAge = 20
End If
‘ 2. IsNumericで型チェック
If IsNumeric(inputAge) Then
‘ 数字として扱えるなら数値型に変換して代入
safeAge = CDbl(inputAge)
Else
‘ 異常値の場合はログを出してデフォルトへ逃がす
WScript.Echo “警告: 数値以外が渡されました。既定値20を使用します。”
safeAge = 20
End If
‘ 3. 安全な値を使って処理を続行
WScript.Echo “処理する年齢は: ” & safeAge
—
3. このコードに隠された「アーキテクトの知見」
① IsNumeric と IsDate の役割
VBScriptには強力な型判定関数が備わっています。
- IsNumeric: 文字列が数値として計算可能か判断します。
- IsDate: 日付として変換可能かを判断します。
これらを通さずに計算を行うのは、目隠しをして高速道路を走るようなものです。必ず「チェックして、ダメならデフォルト」というフローを守ってください。
② WScript.Arguments.Count の重要性
`WScript.Arguments(0)` をいきなり参照してはいけません。引数が渡されていない状態でインデックスを指定すると、「添字が範囲外です」という致命的なエラーが発生します。必ず `.Count` で箱の中に中身があるか確認する癖をつけましょう。
③ 明示的な型変換 (CInt, CDbl, CDate)
VBScriptの変数は「Variant型(何でも入る箱)」です。便利な反面、予期せぬ挙動を招きます。`CDbl()` や `CInt()` を使うことで、「これは数値として扱う」という意思表示をコードに刻むことができます。
—
4. 陥りやすいエラーと対策
- 「型が一致しません」エラー:
文字列の「10」と数値の「10」を足そうとすると、VBScriptは混乱します。バリデーション後に必ず明示的な型変換関数を通してください。
- 「添字が範囲外です」:
引数チェックを省略している証拠です。`.Count` で安全を確認してからアクセスしましょう。
—
まとめ:ここをクリアすれば、もう怖くない
プログラミングにおいて、「ユーザー(あるいは外部プログラム)は、必ず間違った値を入力する」という前提で設計するのが、真に堅牢なシステムを作る第一歩です。
1. Count で存在確認
2. IsNumeric / IsDate で型確認
3. 変換関数 で型を確定させる
この3ステップを意識するだけで、あなたの書くVBScriptは、突然停止することのない「プロフェッショナルなツール」に生まれ変わります。
さあ、次はあなたのスクリプトにこのガードレールを設置してみてください。コードが驚くほど安定するはずですよ。応援しています!
