【入門編】【外部コマンド実行】WScript.Shell.Run と Exec の使い分けによる標準出力取得と戻り値判定 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで外部コマンドを「完全に御する」:RunとExecの境界線

こんにちは。自動化の世界へようこそ。
VBScript(WSH)を使っていると、必ずぶつかる壁があります。「他のコマンドやツールを呼び出したい」という欲求です。

しかし、ただ `WScript.Shell.Run` を書くだけでは、プロフェッショナルな自動化とは言えません。なぜなら、「実行した結果をどう受け取るか」「処理が完了するのを待つべきか」という制御こそが、安定したシステムを構築する鍵だからです。

今日は、VBScriptにおける外部実行の二大巨頭、`Run` と `Exec` の本質的な違いと、現場で死なないための使い分けを伝授します。

1. Runメソッド:手軽さと「終了待ち」の制御

`WScript.Shell.Run` は、外部プログラムを実行するための最も標準的なメソッドです。

Runの性質

  • 戻り値: プログラムが終了した際の「終了コード(Exit Code)」を整数で返します。
  • 同期・非同期: 第3引数に `True` を指定することで、プログラムの終了を待つ(同期)ことができます。
  • 制約: 標準出力を取得できません。 画面に文字を出すだけのツールや、ただ起動して終わりたい場合に適しています。

基本的な書き方

Set objShell = CreateObject(“WScript.Shell”)

‘ 第1引数: コマンド, 第2引数: ウィンドウ形式(0は非表示), 第3引数: 終了を待つか(True/False)
intReturn = objShell.Run(“cmd /c echo Hello World > output.txt”, 0, True)

If intReturn = 0 Then
WScript.Echo “成功しました。”
Else
WScript.Echo “エラー発生: コード ” & intReturn
End If

ここがポイント:
`cmd /c` を使うことで、コマンドプロンプトの機能(リダイレクトやパイプなど)をフル活用できます。ただし、あくまで「ファイルに書き出す」というワンクッションが必要です。

2. Execメソッド:標準出力を「直接」吸い上げる

「ファイルに書き出すなんて回りくどいことはしたくない。結果の文字列を直接変数に入れたい」。そんな欲求を満たすのが `WScript.Shell.Exec` です。

Execの性質

  • 戻り値: `WshScriptExec` オブジェクトを返します。
  • 同期・非同期: 常に非同期で実行されます。コードは次の行へ進んでしまうため、`Status` プロパティを監視して待機する必要があります。
  • 最大の強み: 標準出力(StdOut)をリアルタイムでキャプチャ可能です。

実用的なコード例

Set objShell = CreateObject(“WScript.Shell”)

‘ Execはオブジェクトを返す
Set objExec = objShell.Exec(“powershell -Command “”Get-Date”””)

‘ 終了するまで待機(ポーリング)
Do While objExec.Status = 0
WScript.Sleep 100 ‘ CPU負荷軽減のため少し休ませる
Loop

‘ 標準出力を読み取る
strOutput = objExec.StdOut.ReadAll

WScript.Echo “実行結果: ” & vbCrLf & strOutput

ここがポイント:
`Do While objExec.Status = 0` のループが心臓部です。ここで `WScript.Sleep` を入れないと、CPUを無駄に占有してしまうので注意してください。

3. どちらを使うべきか?(現場の判断基準)

エンジニアとして、どちらを選ぶべきか迷ったら、以下の基準で判断してください。

| 特徴 | Run メソッド | Exec メソッド |
| :— | :— | :— |
| 主な用途 | バッチ処理、外部EXEの起動 | コマンドの結果解析、ログ取得 |
| 標準出力 | 取得不可(ファイル経由のみ) | 取得可能(メモリ上で処理) |
| 制御の複雑さ | 低い(引数一つで完了) | 高い(終了監視が必要) |
| 安定性 | 高い | 非常に高い(非同期故のバグに注意) |

  • 「とりあえず実行して、終わったら成功したか知りたい」Run
  • 「コマンドの実行結果を解析して、次の処理に繋げたい」Exec

最後に:初心者から脱却するために

VBScriptで最も陥りやすい罠は、「コマンドの実行エラーを無視してしまうこと」です。

`Run` なら `If intReturn = 0 Then` を、`Exec` なら `objExec.ExitCode` を確認する癖を必ずつけてください。自動化ツールが「動いているフリをして実は失敗している」という事態を防ぐことが、安定したシステム運用の第一歩です。

この二つのメソッドを使い分ければ、VBScriptでできない自動化はほとんどありません。まずは既存のバッチファイルを `Exec` で叩いて、結果をメッセージボックスに出すところから始めてみましょう。

皆さんのエンジニアリングが、より一層洗練されたものになりますように。応援しています!

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