【入門編】【処理同期】WScript.Sleep メソッドを活用した外部プロセス実行と待機制御の基礎 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:外部プロセスとの「優雅な対話」を実現するSleepと同期処理の極意

こんにちは。現場で泥臭い自動化を支え続けてきたエンジニアとして、今日はVBScriptの最も基本的でありながら、実は奥が深い「外部プロセスとの同期」についてお話しします。

マクロの記録から一歩踏み出し、自らOSを操るようになると、必ず直面するのが「スクリプトが速すぎて、処理対象が追いつかない」という問題です。

今日は、`WScript.Sleep`を単なる「待ち時間」としてではなく、「プロセスを安全に制御するための呼吸法」として習得しましょう。ここをクリアすれば、あなたのスクリプトは劇的に安定します。

—

1. なぜ「待つ」必要があるのか?(同期処理の本質)

VBScriptで外部アプリケーション(Excelや他社製ツールなど)を呼び出すとき、OSは「命令を出した」という事実だけを記録して、次の行を即座に実行しようとします。

しかし、アプリケーションの起動やファイルの書き出しは、CPUやディスクの読み書きを伴うため、数ミリ秒〜数秒のラグが生じます。この「隙間」を埋めずに次の操作を強行すると、いわゆる「エラー(オブジェクトが存在しません)」が発生します。

ここで登場するのが `WScript.Sleep` です。

—

2. 【基本コード】WScript.Sleepによる「待機」の作法

まずは、最もシンプルな待機コードを見てみましょう。単位は「ミリ秒」です。

‘ 2秒間処理を停止する(2000ミリ秒)
WScript.Sleep 2000

‘ 外部アプリを起動する例
Set objShell = WScript.CreateObject(“WScript.Shell”)
objShell.Run “notepad.exe”

‘ 起動の余韻を待つ(ここが重要!)
WScript.Sleep 500

なぜこれだけでは不十分なのか?

PCの負荷が高い時、アプリの起動には1秒かかることもあれば、5秒かかることもあります。「固定時間の待機」は、速いPCでは無駄な時間を生み、重いPCではエラーを生むという、「不安定の元凶」になりかねません。

—

3. 実践:リトライループによる「賢い同期」

プロのエンジニアは、固定時間で待つのではなく、「処理が終わるまで、確認しながら待つ」というアプローチを取ります。これが「リトライループ」です。

ファイル作成やアプリの応答を待つ際の「鉄板コード」を公開します。

Dim fso, targetFile, maxRetries, i
Set fso = CreateObject(“Scripting.FileSystemObject”)
targetFile = “C:\Temp\output.txt”

maxRetries = 10 ‘ 最大10回試行
i = 0

‘ ファイルが生成されるまで最大10秒間、1秒おきにチェックする
Do While Not fso.FileExists(targetFile)
i = i + 1
If i > maxRetries Then
WScript.Echo “タイムアウト:ファイルが見つかりません。”
WScript.Quit
End If

‘ 1秒間待機して、CPUに休息を与える
WScript.Sleep 1000
Loop

WScript.Echo “成功:ファイルを確認しました。”

このコードが「プロ仕様」である理由

1. CPUリソースの保護: `Sleep`を挟むことで、チェックのループが高速に回りすぎてCPUを100%消費するのを防ぎます。
2. タイムアウトの実装: 無限ループを避け、エラー発生時にスクリプトを安全に終了させる設計になっています。
3. 可読性: `fso`オブジェクトを活用し、状態を確認してから進むという堅実なステップを踏んでいます。

—

4. 陥りやすい罠:やってはいけないこと

初学者がよくやる「悪手」を共有しておきます。

  • Sleepの過剰利用: 「とりあえず5秒待てば大丈夫だろう」という固定値の乱用は、現場での運用コストを跳ね上げます。可能な限り「結果を確認する」ロジックを組み込みましょう。
  • WScript.SleepとSleepの混同: Windows APIの `Sleep` と混同しないよう注意してください。VBScriptでは必ず `WScript.Sleep` を使用します。

—

5. まとめ:自動化は「対話」である

VBScriptによる自動化は、コンピュータに対する一方的な命令ではなく、「相手(OSやアプリ)の準備ができるまで待つ」という対話のプロセスです。

1. Sleepで呼吸を整える:過剰なCPU消費を防ぎ、システムをいたわる。
2. ループで状態を確認する:確実な結果が得られるまで待機を繰り返す。

この2つを組み合わせれば、あなたのスクリプトは劇的にタフになります。

まずは今日紹介したリトライループのコードを、自分が普段行っている自動化タスクに組み込んでみてください。「エラーが出る前に待機する」という癖がついた時、あなたはもう初心者ではありません。

何か分からないことがあれば、いつでも聞いてくださいね。一緒に最強の自動化環境を築いていきましょう!

タイトルとURLをコピーしました