【入門編】【サイレント実行】WScript.Shell.Run の WindowStyle パラメータによる黒い画面(cmd)を見せない完全バックグラウンド処理 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ自動化ツールを作っていると、こんな悩みに出くわしませんか?

「VBScriptからバッチファイルや外部コマンドを呼び出したとき、あの『黒い画面(コマンドプロンプト)』が一瞬バッと表示されるのが、どうにもダサい……。
「ユーザーに操作させている裏で、こっそりバックグラウンド処理を完結させたいのに、画面がパッと点滅するのが気になる……。」

分かります。その「黒い画面のチラ見え」、業務ツールの完成度をグッと下げてしまう原因になりますよね。

今回は、VBScriptの強力な武器である `WScript.Shell` オブジェクトの `Run` メソッドを極め、「黒い画面を一瞬たりとも表示させない(サイレント実行)」ための極意を伝授します。ここをクリアすれば、あなたのVBScriptは一気にプロの仕上がりになりますよ。それでは、一緒に紐解いていきましょう!

1. なぜ「黒い画面」が出てしまうのか?(WScript.Shellの基本)

VBScriptから外部のプログラムやバッチファイルを動かすとき、私たちは通常 `WScript.Shell` というオブジェクトを使います。

Windowsの裏側を縦横無尽に操るこのオブジェクトですが、何も考えずに外部コマンドを呼び出すと、OSは親切心(?)から「おっ、実行用のコンソール画面(黒い画面)を用意したよ!」とばかりに、画面を表示してしまいます。

まずは、よくある「黒い画面が出てしまうコード」を見てみましょう。

‘ 【NG例】これだと実行時に必ず黒い画面が一瞬表示されます
Dim ws
Set ws = CreateObject(“WScript.Shell”)

‘ 引数なし、またはデフォルト設定での実行
ws.Run “C:\tools\my_process.bat”, 1, True

Set ws = Nothing

このコードの何がいけないのか? 鍵を握るのは `Run` メソッドの第2引数(WindowStyle)です。ここを省略したり `1` にしたりすると、「ウィンドウを表示して通常起動する」という命令になってしまうため、あの黒い画面が爆誕してしまうのです。

2. 魔法の数字「0」:WindowStyleパラメータの秘密

この問題を一発で解決するのが、`Run` メソッドの第2引数に指定する `0` という値です。

`Run` メソッドの構文は以下のようになっています。

> `object.Run(strCommand [, intWindowStyle] [, bWaitOnReturn])`

  • `strCommand`: 実行したいプログラムやバッチファイルのパス
  • `intWindowStyle`: ウィンドウの表示スタイル(ここが今回のキモ!)
  • `bWaitOnReturn`: コマンドの終了を待つか (`True` / `False`)

この `intWindowStyle` に指定できる主な値を見てみましょう。

| 値 | 定数名(イメージ) | 動作 |
| :— | :— | :— |
| `0` | `vbHide` / 非表示 | ウィンドウを非表示(完全に隠す)にして実行。今回の大本命! |
| `1` | `vbNormalFocus` | 通常サイズでウィンドウを表示して実行(デフォルト) |
| `2` | `vbMinimizedFocus` | 最小化して実行 |
| `3` | `vbMaximizedFocus` | 最大化して実行 |

お分かりいただけたでしょうか? `0` を指定することで、プロセスは裏でしっかりと動きながらも、ユーザーの目には一切ウィンドウ触れさせない(=サイレント実行) ことが可能になるのです。

3. 【実践】黒い画面を完全に消し去るサンプルコード

それでは、実際に現場でそのまま使える、美しく洗練されたVBScriptのコードを見てみましょう。

今回は、「処理の完了をVBScript側でしっかり待つ(同期処理)」という実用的なパターンで記述しています。

‘ ==============================================================================
‘ ファイル名: silent_executor.vbs
‘ 概要 : 黒い画面(コマンドプロンプト)を一切出さずにバッチを裏で実行するサンプル
‘ ==============================================================================

Option Explicit

Sub Main()
Dim shell
Dim targetBatch
Dim exitCode

‘ 1. WScript.Shellオブジェクトを生成
Set shell = CreateObject(“WScript.Shell”)

‘ 2. 実行したいバッチファイルやスクリプトのパスを指定
‘ (※ご自身の環境にあわせてパスを変更してください)
targetBatch = “C:\Automation\sample.bat”

‘ 3. 【最重要】Runメソッドの引数設定
‘ 第1引数: 実行コマンド
‘ 第2引数: 0 (ウィンドウを非表示=黒い画面を出さない)
‘ 第3引数: True (バッチの処理が完全に終わるまでVBScript側の処理を待つ)
WScript.Echo “バックグラウンドで処理を開始します…”

exitCode = shell.Run(“””” & targetBatch & “”””, 0, True)

‘ 4. 実行結果のハンドリング
If exitCode = 0 Then
WScript.Echo “すべての処理が正常に完了しました。”
Else
WScript.Echo “エラーが発生しました。終了コード: ” & exitCode
End If

‘ 5. オブジェクトの解放(メモリ管理の基本です)
Set shell = Nothing
End Sub

‘ メイン処理の呼び出し
Main()

💡 現場のエンジニアが教える、ちょっとしたハマりどころ

上記のコードで、パスをダブルクォーテーションで囲んでいる部分に気づいたでしょうか?
`”””” & targetBatch & “”””`

もし実行するファイルパスや引数の中に「スペース(空白)」が含まれている場合、Windowsはパスの解釈に失敗してエラーを起こします。そのため、パス全体をダブルクォーテーションで二重に囲んで安全性を高めるのが、プロの現場での定石です。ここはぜひ覚えておいてくださいね!

財布の紐ならぬ、ウィンドウの表示をキュッと締め上げる `WindowStyle = 0`。
このテクニックを知っているだけで、あなたが作る自動化ツールの「プロっぽさ」と「ユーザー体験(UX)」は劇的に向上します。

「画面がパッと出てパッと消えるのがカッコ悪いな……」と思っていたストレスから、今日でサヨナラしましょう。

ここをクリアできれば、VBScriptの制御はもうバッチリです!
ぜひ、日々の業務自動化に役立ててくださいね。それでは、次のステップへ進みましょう!

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