VBScriptを掌握せよ:64bitの壁を突破する「実行環境の自動最適化」術
こんにちは。現場の最前線で自動化を支え続けてきたエンジニアです。
VBScriptで業務自動化を始めると、必ず一度は突き当たる「透明な壁」があります。それが、「64bit OS環境下での `cscript.exe` の二面性」です。
「昨日まで動いていたスクリプトが、今日は動かない」「特定のCOMコンポーネントが見つからない」……そんな怪奇現象の正体は、Windowsが隠し持っている「レジストリのリダイレクト」という仕組みにあります。
今回は、この深い闇を解き明かし、あなたのスクリプトを「どんな環境でも自律して動作する強靭なコード」へ進化させる方法を伝授します。
—
1. なぜ「壁」は存在するのか?(アーキテクチャの真実)
64bit版のWindowsには、互換性を維持するために2つの場所が存在します。
- `C:\Windows\System32\cscript.exe`:64bitネイティブの実行環境
- `C:\Windows\SysWOW64\cscript.exe`:32bit互換の実行環境
ここが罠です。あなたが古いActiveXコントロール(32bit)や、32bit版のOffice操作を自動化しようとする場合、64bit版の `cscript` からはそれらが見えません。 レジストリが「64bit用」と「32bit用(SysWOW64)」に分離されているからです。
この「見えない」というエラーは、初学者が最初に挫折する最大の原因です。
—
2. 「どちらで動いているか」を判定する
まずは、自分のスクリプトが今、どちらの環境に足を踏み入れているのかを検知する知見を身につけましょう。VBScriptでは `ProcessArchitecture` を確認することで、瞬時に見極めが可能です。
‘ 環境判定用ロジック
Function Is64BitProcess()
Dim shell, arch
Set shell = CreateObject(“WScript.Shell”)
‘ 環境変数 PROCESSOR_ARCHITECTURE を確認
arch = shell.ExpandEnvironmentStrings(“%PROCESSOR_ARCHITECTURE%”)
‘ WOW64が存在するかで、32bitプロセスが64bit上で動いているかを判定
If shell.ExpandEnvironmentStrings(“%PROCESSOR_ARCHITEW6432%”) <> “%PROCESSOR_ARCHITEW6432%” Then
Is64BitProcess = True
Else
Is64BitProcess = False
End If
End Function
—
3. 伝説の「自己再起動スクリプト」
ここからが本題です。スクリプトが「意図しない環境」で実行された場合、自分自身を正しい実行エンジンのパスへ投げ直すという「自己修復アーキテクチャ」を実装します。
32bit版のCOMコンポーネントを扱うなら、必ず `SysWOW64` 側の `cscript` を通す必要があります。
‘ 実行環境を32bit (SysWOW64) に強制固定するシェルブートローダー
Dim wshShell, scriptPath, cmd
Set wshShell = CreateObject(“WScript.Shell”)
‘ 現在のプロセスが 64bit ネイティブか判定 (簡易的な手法)
If InStr(WScript.FullName, “System32″) > 0 Then
‘ SysWOW64のcscriptへパスを書き換える
scriptPath = Replace(WScript.ScriptFullName, ” “, “”” “””)
cmd = “C:\Windows\SysWOW64\cscript.exe //nologo ” & scriptPath
‘ 再起動して、自分自身を終了させる
wshShell.Run cmd, 1, False
WScript.Quit
End If
‘ — ここから下が本来のメイン処理 —
WScript.Echo “成功:32bit環境(SysWOW64)で稼働中です。”
‘ ここにCOMオブジェクト呼び出し処理などを記述してください
このコードの「魂」
1. パスの置換: `WScript.ScriptFullName` で自分自身のフルパスを取得し、スペースが含まれていてもエラーにならないよう引用符で囲みます。
2. プロセスの乗せ換え: `WScript.Quit` を呼ぶことで、誤った環境のインスタンスを即座に破棄し、新しい環境へ処理をバトンタッチします。
3. //nologo オプション: 余計な著作権表示を出さないことで、ログを汚さず自動実行をクリーンに保ちます。
—
4. 現場で生き残るための「心構え」
VBScriptは古い言語と言われますが、Windowsの深層心理(APIやCOM)と直結しているため、この「アーキテクチャの壁」を理解しているエンジニアは、現代のPowerShellやPythonのスクリプトにおいても、他を圧倒する安定したシステムを構築できます。
「環境を疑う」という姿勢は、プロフェッショナルへの第一歩です。
- COMのエラーが出たら? → 「環境(32/64bit)は合っているか?」をまず疑う。
- パスが見つからないと言われたら? → 「環境変数のリダイレクト」を疑う。
ここをクリアしたあなたは、もうマクロの記録をポチポチ押すだけのユーザーではありません。Windowsの実行環境を支配する「オートメーション・アーキテクト」の入り口に立っています。
さあ、恐れずにコードを書いてください。あなたのスクリプトは、もうどんな環境でも迷子にはなりません。
