VBScriptで「メイン処理を止めない」究極のバックグラウンド監視術
こんにちは。業務自動化の深淵へようこそ。
VBScriptを触り始めると、誰もが一度は「処理が終わるまで画面が固まる」「待機中に他のことが何もできない」という壁にぶつかります。特に `WScript.Run` を使っていると、同期実行(終わるまで待つ)か非同期実行(終わったか分からない)の二択になりがちですね。
今回は、そんなVBScriptの制約を突破する「ノンブロッキング非同期監視」の極意を伝授します。`WScript.Shell.Exec` と `Status` プロパティを使いこなし、メイン処理を止めることなく外部タスクを制御する、プロの作法を学びましょう。
—
1. なぜ「止まってしまう」のか?
VBScriptの標準的な実行メソッド `Run` は、基本的に「呼び出し元をブロックする」か「完全に切り離す」かのどちらかです。
- `Run(cmd, 1, True)`: 終了まで待つ(メイン処理がフリーズ)
- `Run(cmd, 1, False)`: 実行したら即終了(タスクが死んだか成功したか追跡不能)
これでは、大規模な自動化システムは組めません。ここで登場するのが `Exec` メソッドです。これは外部プロセスを「オブジェクト」として保持できるため、その状態をいつでも監視できるという強力なメリットがあります。
—
2. 核心:Status プロパティによるポーリング
`Exec` で取得したオブジェクトには `Status` プロパティがあります。
- `0`: まだ実行中 (`WshRunning`)
- `1`: 終了 (`WshFinished`)
この `Status` を一定間隔で確認し、メイン処理の合間に「終わったかな?」と覗きに行く仕組みをポーリングと呼びます。
実践コード:メイン処理を止めない監視ルーチン
このコードは、メインのループを維持しながら、外部タスクの終了を監視する雛形です。
‘ WScript.Shell オブジェクトの生成
Set objShell = WScript.CreateObject(“WScript.Shell”)
‘ 非同期で外部プロセスを実行 (Execはオブジェクトを返す)
Set objExec = objShell.Exec(“notepad.exe”) ‘ 例としてメモ帳を起動
WScript.Echo “メイン処理を開始しました。メモ帳の終了を監視します。”
‘ — ノンブロッキング監視ループ —
‘ タイムアウト設定 (例: 10秒経過したら強制終了)
maxWaitSeconds = 10
startTime = Timer
Do While objExec.Status = 0
‘ メイン処理を止めないための短いSleep
WScript.Sleep 500
‘ タイムアウト判定
If Timer – startTime > maxWaitSeconds Then
objExec.Terminate ‘ 強制終了
WScript.Echo “タイムアウト!プロセスを強制終了しました。”
Exit Do
End If
‘ ここでメインの動的な処理を行うことが可能
WScript.StdOut.Write “.”
Loop
WScript.Echo vbCrLf & “監視終了。プロセスは終了しました。”
—
3. 初学者が陥りやすい「落とし穴」
この手法を実装する際、多くのエンジニアが以下の罠にハマります。
① `Sleep` の時間を軽視しない
`WScript.Sleep 0` や極端に短い `Sleep` は、CPUを100%消費する「ビジーウェイト」になり、PC全体の動作を重くします。人間が認識できないレベルの `100ms 〜 500ms` 程度の `Sleep` を入れるのが、OSと仲良くする秘訣です。
② `Terminate` の強引さ
`Terminate` メソッドは、いわば「タスクマネージャーでの強制終了」です。保存が必要なアプリに対して行うとデータが破損します。可能な限り、タスク側が自律的に終了するのを待つ設計を心がけてください。
③ 戻り値の確認漏れ
`Exec` は `StdOut` を通じて、外部プログラムの出力結果を読み取ることができます。終了を確認した後、`objExec.StdOut.ReadAll()` を呼び出すことで、プログラムが何を吐き出したのかを確認するのも忘れないようにしましょう。
—
まとめ:ここをクリアすれば「自動化のプロ」です
今回の「ノンブロッキング監視」をマスターすれば、以下のようなことが可能になります。
1. 複数の外部タスクを並行監視(AとBが終わったらCを動かす等)
2. ユーザーに「応答なし」と言わせない(メインループで進捗表示が可能)
3. 無駄な待ち時間を削減(処理完了と同時に次のステップへ移行)
VBScriptは古い言語と言われますが、こうしたOSのプロセス制御を直接叩ける点において、今なおWindows環境の自動化における「最強の小刀」です。
まずはこのコードをコピペして、メモ帳やコマンドプロンプトの監視から始めてみてください。あなたのPCの中の「小さな秘書」が、ようやく効率的に動き出すはずです。
何か分からないことがあれば、いつでも聞いてくださいね。一緒に最強の自動化ツールを作り上げましょう。
