VBScriptで「止まらない」CLIを作る:ノンブロッキング入力監視の極意
こんにちは。現場で泥臭い自動化と格闘し続けてきた諸君、ようこそ。
VBScriptといえば「古い」「限定的」というレッテルを貼られがちですが、実はWindowsの心臓部を直接叩ける、極めて強力な武器です。特に`CScript`環境でCLIツールを作る際、多くの初学者がぶつかる壁が「入力待ちによる処理の停止(ブロッキング)」です。
「ユーザーが何か入力するまで、バックグラウンドのログ監視やタイマー処理が止まってしまう…」
そんな悩みを抱えていませんか?
今日は、`WScript.StdIn`と`Sleep`を巧みに組み合わせ、「処理を止めずにキー入力を監視する」という、プロレベルのテクニックを伝授します。ここをマスターすれば、君のVBScriptは「ただの定型処理スクリプト」から「対話型のインテリジェントなツール」へと進化します。
—
1. なぜ「ブロッキング」が問題なのか?
通常、`WScript.StdIn.ReadLine`を実行すると、スクリプトはユーザーがEnterキーを押すまで「完全にフリーズ」します。
- 何が起きるのか?:バックグラウンドで動かしたいはずの進捗バーの更新や、ログの書き出し、サーバーのステータスチェックなどが、入力待ちの瞬間にすべて停止します。
- 解決策:`StdIn.AtEndOfLine` を使って、「今、入力があるか?」をノンブロッキング(非同期に近い形)で確認するのです。
—
2. 実装コード:ノンブロッキング監視のテンプレート
このコードをコピーして、拡張子 `.vbs` で保存し、コマンドプロンプト(`cscript script.vbs`)で実行してみてください。
‘ — ノンブロッキング入力監視テンプレート —
Option Explicit
Dim wshShell
Set wshShell = WScript.CreateObject(“WScript.Shell”)
WScript.StdOut.WriteLine “処理を開始します。何か入力してEnterを押すと停止します。”
‘ メインループ:ここが心臓部です
Do While True
‘ 1. 入力があるかチェック(AtEndOfLineは待機させない)
‘ ※注意:StdIn.AtEndOfLineはCScript環境でのみ有効です
If Not WScript.StdIn.AtEndOfLine Then
Dim userInput
userInput = WScript.StdIn.ReadLine
WScript.StdOut.WriteLine “入力を検知: ” & userInput
Exit Do ‘ 入力があればループを抜ける
End If
‘ 2. バックグラウンド処理のシミュレーション
WScript.StdOut.Write “.” ‘ 処理中であることを示すドット
‘ 3. CPU負荷を抑えるための休憩(Sleep)
‘ ここが重要!短すぎるとCPUを食い潰し、長すぎると入力検知が遅れる。
‘ 100ms〜200ms程度が現場では黄金比です。
WScript.Sleep 200
Loop
WScript.StdOut.WriteLine “プログラムを終了します。”
—
3. このコードを掌握するための3つのポイント
① `AtEndOfLine` の正体
これは「入力ストリームの終端に達しているか?」を確認するプロパティです。重要なのは、「入力を待たずに判定を返す」点。これを使うことで、入力がない場合はすぐに次の行(バックグラウンド処理)へ制御を戻せます。
② `WScript.Sleep` の役割
このループに `Sleep` がないと、スクリプトは超高速で空回りを続け、CPU使用率が100%に張り付いてしまいます。`Sleep` はOSに対して「少しの間、CPUを他のプロセスに譲るよ」という礼儀正しい合図です。
③ 実行環境の落とし穴:`WScript` vs `CScript`
ここが初心者が最もハマる罠です。VBScriptをダブルクリックして実行すると、デフォルトの `WScript.exe` が使われます。これには `StdIn` が存在しません。
必ずコマンドプロンプトを開き、
`cscript your_script.vbs`
と明示的に実行してください。
—
4. 現場のアーキテクトからのアドバイス
この手法を応用すれば、例えば「一定時間入力がなければ自動でタイムアウトしてシャットダウンするツール」や、「コマンド入力で即座にログレベルを切り替える監視ツール」が作れます。
「完璧なコードを書こうとしないこと」。
VBScriptは、今この瞬間の課題を解決するためにあるものです。`Sleep` のミリ秒単位を調整し、自分の環境に最適な「応答速度」を見つけてください。
さあ、この「ノンブロッキング監視」を武器に、君の自動化ツールに「心」を吹き込んでみましょう。質問があればいつでも聞いてください。応援していますよ。
