こんにちは!自動化の世界へようこそ。
普段、Excelマクロ(VBA)やデスクトップ自動化に触れていると、「ちょっとした設定値をユーザーに聞いてから処理を実行する、カッコいい黒い画面(CLI)のツールを作りたいな」と思う瞬間はありませんか?
GUIを作るほどでもないけれど、毎回ハードコーディングされた値を書き換えるのはダサいし、ミスのもと。
今回は、CScript環境(コマンドプロンプト)で動く、プロ仕様の「入力ハンドラー」の作り方を伝授します。
デフォルト値の自動提示(ブラケット表示)や、何も入力せずに「Enter」を押されたらデフォルト値を自動採用するスマートな仕組みを、VBScriptの根幹であるWSHのオブジェクトライフサイクルと共にマスターしましょう。ここをクリアすれば、あなたのスクリプトは見違えるほど洗練されますよ!
—
なぜ「CScript」と「標準入出力」なのか?
VBScriptをダブルクリックして実行すると、デフォルトでは `WScript.exe`(GUI環境)が裏で動きます。この環境で `InputBox` を出すと、Windowsのポップアップが出てきますよね。
しかし、本格的なバッチ処理や自動化パイプラインに組み込む場合、ポップアップは邪魔です。必要なのは、黒い画面(コマンドプロンプト)上で完結する対話型CLI。
そのためには、スクリプトを `cscript.exe` というCUI用のエンジンで明示的に実行させ、標準入力(`WScript.StdIn`)と標準出力(`WScript.StdOut`)を完全にコントロールする必要があります。
—
今回目指すゴール:プロ仕様の入力ハンドラー
今回作成する関数 `PromptWithDefault` は、以下の要件を完璧に満たします。
1. デフォルト値の提示: プロンプトの末尾に `[デフォルト値]` を自動で付与する。
2. 空エンターの検知: ユーザーが何も入力せずにEnterキーを押した場合、自動的にデフォルト値を採用する。
3. 安全なメモリ管理: WSHのストリームオブジェクトを適切に扱い、リソースリークを防ぐ。
完成版コード:実戦投入可能なVBScript
以下のコードをメモ帳に貼り付け、拡張子を `.vbs`(例: `interactive.vbs`)で保存してください。
‘ ==============================================================================
‘ ファイル名: interactive.vbs
‘ 概要: CScript標準入力を使用したデフォルト値付き高度入力ハンドラー
‘ 実行方法: cscript interactive.vbs
‘ ==============================================================================
Option Explicit
‘ メイン処理の実行
Main
Sub Main()
‘ 1. 実行エンジンが CScript かどうかの厳密なチェック
If Not IsCScript() Then
WScript.Echo “【エラー】このスクリプトは CScript.exe で実行してください。” & vbCrLf & _
“例: cscript ” & WScript.ScriptName
WScript.Quit 1
End If
WScript.StdOut.WriteLine “=== デプロイ設定ウィザード ===”
‘ 2. 入力ハンドラーの呼び出し(プロンプト、デフォルト値、データ型などの指定)
Dim targetEnv
targetEnv = PromptWithDefault(“デプロイ先環境”, “staging”)
Dim timeoutSec
timeoutSec = PromptWithDefault(“タイムアウト秒数”, “30”)
‘ 3. 結果の出力
WScript.StdOut.WriteLine vbCrLf & “— 設定完了 —”
WScript.StdOut.WriteLine “対象環境: ” & targetEnv
WScript.StdOut.WriteLine “タイムアウト: ” & timeoutSec & ” 秒”
End Sub
‘ ——————————————————————————
‘ 関数名: PromptWithDefault
‘ 目的: デフォルト値付きの入力を標準入力から安全に取得する
‘ ——————————————————————————
Function PromptWithDefault(ByVal promptMessage, ByVal defaultValue)
Dim stdIn, stdOut
Set stdIn = WScript.StdIn
Set stdOut = WScript.StdOut
‘ プロンプト文字列の構築(例: デプロイ先環境 [staging]: )
Dim displayPrompt
displayPrompt = promptMessage & ” [” & defaultValue & “]: ”
‘ ユーザーに入力を促す
stdOut.Write displayPrompt
‘ 標準入力から1行読み込む
Dim userInput
userInput = stdIn.ReadLine
‘ 前後の空白をトリム
userInput = Trim(userInput)
‘ 入力が空(何も入力されずにEnterが押された)の場合はデフォルト値を採用
If userInput = “” Then
PromptWithDefault = defaultValue
Else
PromptWithDefault = userInput
End If
‘ オブジェクトの参照破棄(VBScriptのお作法)
Set stdIn = Nothing
Set stdOut = Nothing
End Function
‘ ——————————————————————————
‘ 補助関数: CScriptで実行されているか判定する
‘ ——————————————————————————
Function IsCScript()
Dim fullName, engineName
fullName = LCase(WScript.FullName)
engineName = Right(fullName, InStrRev(fullName, “\”))
If InStr(LCase(WScript.FullName), “cscript.exe”) > 0 Then
IsCScript = True
Else
IsCScript = False
End If
End Function
—
コードの深掘り解説:ここがエンジニアの腕の見せ所
初心者から一歩抜け出すために、このコードの重要なポイントを3つに絞って解説します。
1. `Option Explicit` による変数の厳格化
コードの最上部にある `Option Explicit`。これがないVBScriptコードは、プログラミング界の「野良犬」と言っても過言ではありません。
これを宣言することで、タイポ(変数名のスペルミス)による意図しないバグをコンパイル段階(実行前)で完全にシャットアウトできます。プロとして絶対に外せない鉄則です。
2. `WScript.StdIn` と `StdOut` のライフサイクル
GUIのVBScriptではお目にかからない `WScript.StdIn`(標準入力)と `WScript.StdOut`(標準出力)。
- `StdOut.Write` は、`WScript.Echo` と違って末尾に改行を入れません。そのため、プロンプトの直後にユーザー入力を待機させることができます。
- `StdIn.ReadLine` は、ユーザーがエンターキーを押すまで処理をブロック(一時停止)し、入力された文字列を回収します。
- 処理の最後で `Set stdIn = Nothing` とオブジェクトを明示的に解放しています。VBScriptのガベージコレクションは優秀ですが、明示的な解放はメモリリークを防ぐ美しいコードの証明です。
3. 空文字判定とトリム処理
ユーザーが「何も入力せずにEnter」を押した場合、`stdIn.ReadLine` は長さ0の文字列 `””` を返します。さらに、意図せずスペースが入力されるリスクも考慮し、`Trim(userInput)` で前後の余分な空白を切り落としてから判定しています。
「もし空っぽなら、あらかじめ用意した `defaultValue` を入れる」というこのシンプルな分岐が、実務で驚くほどユーザービリティを高めてくれます。
—
陥りやすい罠とエラー回避のコツ
トラップ 1: ダブルクリックして動かしてしまい「あれ?」となる
このスクリプトをエクスプローラーからダブルクリックして実行すると、一瞬黒い画面が出て消えるか、エラーになります。
必ずコマンドプロンプト(cmd.exe)を開き、手動で `cscript interactive.vbs` と打ち込んで実行してください。
トラップ 2: 文字コードの罠(日本語化け対策)
Windowsのコマンドプロンプトのデフォルト文字コードは、環境によってShift-JIS(CP932)であることが多いです。VBScriptファイルを保存する際は、文字コードを 「ANSI(Shift-JIS)」 または 「UTF-8(BOM付き)」 に設定しないと、日本語のプロンプトが文字化けします。現場でトラブルが起きたら真っ先にここを疑いましょう。
—
おわりに
いかがでしたか?
今回は、VBScriptとCScriptを組み合わせた「対話型CLIフォーム構築」の極意をお伝えしました。
「たかが入力受付」と思われるかもしれませんが、こうした細かなユーザビリティの配慮が、現場で愛される堅牢な自動化ツールと、単なるやっつけ仕事のスクリプトを分ける境界線になります。
ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです。ぜひ自分の業務環境に合わせてカスタマイズし、まわりのエンジニアをあっと言わせる自動化ツールを作ってみてくださいね!
