VBScriptを「真のバックグラウンドツール」へ。黒い画面を一瞬で消し去る極意
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアなら、一度はこう思うはずです。
「VBScriptでタスクを自動化したのはいいが、実行するたびにあの黒いコンソール画面が『パッ』と出て消えるのが、どうにもスマートじゃない……」
そう、`CScript`でスクリプトを走らせると、Windowsは律儀にウィンドウを生成してしまいます。これは「処理が動いている」という安心感にはなりますが、業務ツールとしては「野暮」そのもの。
今日は、この「黒い画面」を物理的に消し去り、背後で静かに、かつ確実に仕事を完遂させるための「VBScriptのウィンドウ非表示術」を伝授します。
—
なぜ、黒い画面が出るのか?
VBScriptには、実行エンジンが2つあります。
1. WScript: GUI環境向け。メッセージボックスを表示するような処理が得意。
2. CScript: コンソール(CUI)環境向け。標準出力(Echo)をコマンドプロンプトに流す。
自動化スクリプトで`CScript`を使うのは、ログの制御やパイプライン処理に有利だからですが、Windowsは「コンソールを使うなら画面を出さねば」という親切心でウィンドウを立ち上げます。これを「WScriptに切り替えて実行する」という力技で解決しましょう。
—
手法①:WScriptで「二段構え」のラッパーを書く(推奨)
これが最も美しく、OSへの負荷も低い手法です。本体の処理はそのままに、それを呼び出す「門番(ラッパー)」を一枚噛ませます。
実行用ラッパーコード (`run_hidden.vbs`)
以下のコードをテキストファイルに貼り付け、`.vbs`で保存してください。
‘ — run_hidden.vbs —
‘ WScript.Shellオブジェクトを生成
Set objShell = CreateObject(“WScript.Shell”)
‘ 引数として実行したい本体のスクリプトを指定
strTargetScript = “my_business_logic.vbs”
‘ Runメソッドの第3引数(bWaitOnReturn)をTrueにすると終了まで待機
‘ 第2引数(intWindowStyle)を0にすると、ウィンドウが非表示(vbHide)になる
objShell.Run “cscript.exe //nologo ” & strTargetScript, 0, True
Set objShell = Nothing
ここがポイント!
- `//nologo`: CScript起動時の著作権表示を消すオプション。これも黒い画面を「無駄に」しないための必須設定です。
- `0`: `WshShell.Run` の第2引数で「0」を指定することで、OSのAPIに対して「非表示(Hide)で起動せよ」と命令を出しています。
—
手法②:Win32_Process を利用した本格的な制御
もし、あなたが「どうしてもCScriptとして起動したまま、後からウィンドウを隠したい」という高度な制御を求めるなら、`WMI (Windows Management Instrumentation)` を使うのがエンジニアの流儀です。
‘ — win32_process_launch.vbs —
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set objStartup = objWMIService.Get(“Win32_ProcessStartup”)
Set objConfig = objStartup.SpawnInstance_
‘ ウィンドウを非表示にする設定
objConfig.ShowWindow = 0
Set objProcess = objWMIService.Get(“Win32_Process”)
‘ コマンドラインを指定して起動
errReturn = objProcess.Create(“cscript.exe //nologo C:\scripts\my_logic.vbs”, null, objConfig, intProcessID)
If errReturn = 0 Then
WScript.Echo “プロセスID: ” & intProcessID & ” で起動しました。”
Else
WScript.Echo “起動失敗。エラーコード: ” & errReturn
End If
なぜこれを使うのか?
この手法は、単にウィンドウを隠すだけでなく、「プロセスの生成をOSの管理レイヤー(WMI)から直接叩く」ため、実行権限や環境変数の継承をより細かくコントロールしたい現場で重宝されます。
—
陥りやすいエラーと回避策
初心者がこの領域で必ずぶつかる壁が2つあります。
1. 「ログが見えないと不安」問題
ウィンドウを隠すと、`WScript.Echo`の結果も当然見えなくなります。非表示にする際は、必ずテキストファイルへの「ログ出力機能」を本体のスクリプトに実装しておきましょう。「FileSystemObject」を使ってログを追記するのが基本ですよ。
2. 「ゾンビプロセス」問題
非表示で実行すると、エラーで止まった際にプロセスがバックグラウンドに残り続けることがあります。スクリプトの冒頭には必ず `On Error Resume Next` を置き、エラーハンドリングを徹底してください。
—
最後に:先輩からのアドバイス
VBScriptは古い言語と言われますが、Windowsの深層部を叩くには今なお最強のツールです。今日紹介した「ウィンドウの非表示」は、単なる見た目の問題ではありません。「ユーザーに意識させず、システムの一部としてタスクを遂行させる」という、エンジニアリングにおける「透明性」への第一歩です。
ここをクリアしたあなたは、もうただのスクリプトキディではありません。OSの振る舞いを制御する自動化エンジニアの入り口に立っています。
もし実装で詰まったら、焦らずに `Process Explorer` などのツールでプロセスが正しく生存しているか確認してみてください。応援しています!
