こんにちは!現場のシステムを裏から支える自動化エンジニアの先輩です。
皆さんは、VBScriptを使ってタスクランチャーや日次処理のバッチファイルを書いた経験はありますか?「ダブルクリックするだけで動く手軽さ」が魅力のVBScriptですが、実務で使ううちに、こんな恐怖体験をしたことはないでしょうか?
- 「日付を指定して実行するはずが、ユーザーが適当な文字列を入れてスクリプトがクラッシュした…」
- 「数値を足し算したかったのに、文字列として連結されておかしなことになった…」
- 「エラーメッセージの意味が分からず、深夜のインフラ保守で冷や汗をかいた…」
これ、原因の大部分は 「WScript.Arguments(コマンドライン引数)がすべて『文字列(String)』として渡ってくること」 をうっかり忘れている点にあります。
VBScriptは優しく見えて、実は型に少しルーズ(Variant型中心)な言語です。だからこそ、外部から入ってくるデータを自らしっかりガードしてあげなければなりません。
今回は、どんな汚れた入力が来ても華麗にいなし、安全に日付・数値・真偽値へ変換する「プロ仕様の共通型パーサー(安全なキャスト関数)」を伝授します。ここをクリアすれば、あなたの書くVBScriptは「おもちゃのスクリプト」から「実務に耐える堅牢なシステム」へと生まれ変わりますよ。
—
なぜVBScriptの入力値処理は危険なのか?
WScript.Argumentsで受け取る値は、すべてVariant(String型として格納)です。
例えば、以下のようなコードを書いてしまったとしましょう。
‘ 【危険なコードの例】
Dim inputDays
inputDays = WScript.Arguments(0)
‘ ユーザーが「5」ではなく「5日後」や「abc」と入力したら…?
Dim result
result = inputDays + 1 ‘ 予期せぬエラー、または文字列の結合が発生!
VBScriptは動的型付けの側面を持つため、暗黙の型変換(コアーション)を勝手に行おうとします。これがバグの温床です。
「動かす前に、本当にその型に変換できるか?」を検査し、ダメならデフォルト値を返す、あるいは安全に弾く。これがプロの防衛策です。
—
実装:安全な型変換パーサー(ParseUtils.vbs)
それでは、現場でそのままコピペして使える実用的なパーサーコードを公開します。
エラーでスクリプトが強制終了(クラッシュ)するのを防ぎ、安全に目的の型(Date, Long, Boolean)へ変換する関数群です。
‘ ==============================================================================
‘ ファイル名: SafeParser.vbs
‘ 概要: コマンドライン引数を安全に型キャストする共通パーサー
‘ ==============================================================================
Option Explicit
‘ — テスト実行用のメイン処理 —
Sub Main()
WScript.Echo “=== 安全な型キャストパーサーのテスト ===”
‘ 引数が足りない場合の配慮
If WScript.Arguments.Count < 3 Then
WScript.Echo "引数が不足しています。"
WScript.Echo "使用法: cscript SafeParser.vbs [日付] [数値] [真偽値]"
Exit Sub
End Sub
' 1. 日付型 (Date) への安全なキャスト
Dim safeDate
safeDate = ParseToDate(WScript.Arguments(0), Date) ' 変換失敗時は今日の日付をデフォルトに
WScript.Echo "【Date変換結果】: " & safeDate & " (" & VarType(safeDate) & ")"
' 2. 数値型 (Long) への安全なキャスト
Dim safeLong
safeLong = ParseToLong(WScript.Arguments(1), 0) ' 変換失敗時は 0 をデフォルトに
WScript.Echo "【Long変換結果】: " & safeLong & " (" & VarType(safeLong) & ")"
' 3. 真偽値型 (Boolean) への安全なキャスト
Dim safeBool
safeBool = ParseToBoolean(WScript.Arguments(2), False) ' 変換失敗時は False をデフォルトに
WScript.Echo "【Boolean変換結果】: " & safeBool & " (" & VarType(safeBool) & ")"
End Sub
' ==============================================================================
' 1. 安全な日付変換 (Date)
' ==============================================================================
Function ParseToDate(ByVal rawValue, ByVal defaultValue)
' IsDate関数で文字列が日付として解釈可能か厳密にチェック
If IsDate(rawValue) Then
ParseToDate = CDate(rawValue)
Else
' ログ出力(実務ではここにLoggerを挟むとベスト)
WScript.Echo "[WARN] 日付変換失敗: '" & rawValue & "' -> デフォルト値を使用します。”
ParseToDate = defaultValue
End If
End Function
‘ ==============================================================================
‘ 2. 安全な長整数変換 (Long)
‘ ==============================================================================
Function ParseToLong(ByVal rawValue, ByVal defaultValue)
‘ IsNumericは「123.45」や通貨記号もTrueにするため、必要に応じて厳密化が必要
If IsNumeric(rawValue) Then
‘ CLngで長整数(Long)へ明示的にキャスト
‘ ※ 小数点が渡された場合の四捨五入挙動に注意
ParseToLong = CLng(rawValue)
Else
WScript.Echo “[WARN] 数値変換失敗: ‘” & rawValue & “‘ -> デフォルト値を使用します。”
ParseToLong = defaultValue
End If
End Function
‘ ==============================================================================
‘ 3. 安全な真偽値変換 (Boolean)
‘ ==============================================================================
Function ParseToBoolean(ByVal rawValue, ByVal defaultValue)
‘ 文字列の大文字小文字を無視して判定するために小文字化
Dim lowerVal
lowerVal = LCase(CStr(rawValue))
Select Case lowerVal
Case “true”, “1”, “yes”, “on”
ParseToBoolean = True
Case “false”, “0”, “no”, “off”
ParseToBoolean = False
Case Else
WScript.Echo “[WARN] 真偽値変換失敗: ‘” & rawValue & “‘ -> デフォルト値を使用します。”
ParseToBoolean = defaultValue
End Select
End Function
‘ メイン処理のキック
Call Main()
—
コードのポイント:ここがエンジニアのこだわり
上記のコードには、VBScriptを安定稼働させるための重要な知見がいくつか詰まっています。
1. `Option Explicit` の絶対死守
スクリプトの先頭にある `Option Explicit`。これがないコードは「シートベルトなしで高速道路を走るようなもの」です。変数の宣言漏れによるタイポ(スペルミス)を即座に検知し、予期せぬバグを防ぎます。
2. 検査(Is系関数)してから変換(C系関数)する鉄則
VBScriptには、型を調べるための `IsDate` や `IsNumeric` といった優秀な関数が用意されています。いきなり `CDate()` や `CLng()` を呼び出すのではなく、「門番(Is系)」にチェックさせてから「貴賓室(C系)」に通すという二段階防御が、安全なスクリプトの基本思想です。
3. フォールバック(デフォルト値)の設計
もしユーザーが変な入力をした場合に、スクリプトをその場で「ドカン!」とエラー終了(WScript.Quit)させるのは親切ではありません。「失敗した場合は安全なデフォルト値にフォールバックさせ、警告ログを出す」という設計にすることで、無人運用されるバッチ処理(タスクスケジューラ等)での安定性が劇的に向上します。
—
実行してみよう
コマンドプロンプト(cmd.exe)を開き、次のように実行してみてください。
正常系テスト(正しい引数を渡す場合):
cscript SafeParser.vbs 2023-10-01 100 true
> 結果: それぞれ Date, Long, Boolean として正しく型が保持され出力されます。
異常系テスト(汚れたデータをあえて渡す場合):
cscript SafeParser.vbs “あいうえお” “hoge” “maybe”
> 結果: スクリプトはクラッシュせず、警告文(`[WARN] …`)を出力した上で、あらかじめ用意したデフォルト値へ安全にフォールバックします。
—
まとめ:VBScriptを掌握する者への第一歩
今回は、`WScript.Arguments` の入力値を安全に料理する共通パーサーについて解説しました。
- 外部からの入力はすべて「信用ならない文字列」として扱う
- `IsDate` / `IsNumeric` で事前に検査する
- 失敗時のフォールバック(デフォルト値)を必ず用意する
この3つを意識するだけで、あなたの書くVBScriptの品質はプロのエンジニアの水準に達します。「動けばいいや」から「安全に、美しく動かす」へ。
ここをクリアすれば、VBScriptの基本はバッチリです!自信を持って、日々の業務自動化に挑んでくださいね。それでは、また次の現場でお会いしましょう!
