こんにちは!VBScriptの世界へようこそ。
業務自動化やWindows管理の現場で、VBScriptとWSH(Windows Script Host)は今なお現役の強力な相棒です。
さて、今回は少し踏み込んだ、しかし実務では避けて通れない「64bit OS特有の罠」についてお話しします。
「自分が書いたスクリプトなのに、なぜかレジストリが見つからない」「ファイルがないと言われる」。そんな怪奇現象に悩まされたことはありませんか?
犯人は、Windowsの裏側でこっそり行われている「リダイレクト(迷い込み現象)」です。
ここをクリアすれば、あなたもVBScriptの裏仕組みを完全に掌握した中級エンジニアの仲間入りです。優しく、そして深く紐解いていきましょう!
—
1. なぜ「SysWOW64」と「System32」で迷子になるのか?
現代のパソコンの多くは64bit版のWindowsです。
64bitのWindowsには、プログラムを動かすために重要な2つのフォルダが存在します。
1. `C:\Windows\System32` (本来の64bit用フォルダ)
2. `C:\Windows\SysWOW64` (32bit互換用フォルダ)
ここでVBScriptの宿命とも言える罠があります。
もしあなたが32bit版のWSHエンジン(cscript.exe / wscript.exe)からスクリプトを実行すると、Windowsの親切心(?)が働き、勝手に「System32」へのアクセスを「SysWOW64」へとすり替えてしまうのです。
これがいわゆるファイルシステムおよびレジストリのリダイレクトです。
「64bit版のレジストリをいじりたいのに、気づいたら32bit用の別空間をいじっていた……」なんてことになり、業務自動化ツールが誤作動を起こす原因になります。
—
2. 解決策:スクリプトに「自分自身を正しいホストで再起動」させよう!
この問題をスマートに解決するアプローチ、それが「WSHプロファイル診断と自動再起動(Re-launch)フレームワーク」です。
ざっくり言うと、以下のフローをスクリプトの先頭で自動的に行います。
1. 今動いている自分は、32bit版か? 64bit版か?を判定する。
2. もし64bit OS上で32bit版として動いていたら、「本当の64bit版 cscript.exe」を探す。
3. 見つけたら、自分自身を64bit版のcscript.exeで「そっくりそのまま再起動」させ、自分(32bit版)はそっと終了する。
これさえ組み込んでおけば、ユーザーがうっかり32bit版のプロンプトから実行しても、勝手に64bit版の最高環境へとワープして処理を続行してくれます。
—
3. 実装コード:プロファイル診断&自己再起動フレームワーク
以下のコードを、あなたのVBScriptの「一番最初(最上行)」に貼り付けてみてください。現場でそのまま使える実用的なコードです。
‘ ==============================================================================
‘ 【WSHプロファイル診断フレームワーク】
‘ 64bit OS環境下におけるSysWOW64リダイレクトを検知し、
‘ 64bitネイティブのcscript.exeへ安全に再起動(Re-launch)するテンプレート
‘ ==============================================================================
Option Explicit
‘ 処理の本体を実行する前に、まず環境の診断を行う
Call EnsureNative64BitHost()
‘ ——————————————————————————
‘ ここから下が、本来あなたが実行したいメインの処理になります
‘ ——————————————————————————
WScript.Echo “【メイン処理】正常にネイティブ環境で実行されています。”
WScript.Echo “実行中のプロセス: ” & WScript.FullName
‘ 実際の業務ロジックをここに書いていきます…
‘ ==============================================================================
‘ 関数: EnsureNative64BitHost
‘ 役割: OSとWSHのアーキテクチャを判定し、必要に応じて64bit版で自分を再起動する
‘ ==============================================================================
Sub EnsureNative64BitHost()
Dim shell, env, is64BitOS, is32BitProcess, cscriptPath
Set shell = CreateObject(“WScript.Shell”)
Set env = shell.Environment(“Process”)
‘ 1. OS自体が64bitかどうかを判定 (PROCESSOR_ARCHITECTUREをチェック)
is64BitOS = (env(“PROCESSOR_ARCHITECTURE”) = “AMD64”) Or _
(env(“PROCESSOR_ARCHITEW6432”) = “AMD64”)
‘ 2. 現在実行中のWSHプロセスが32bit版 (SysWOW64経由) かどうかを判定
‘ 判定ロジック: 64bitOS環境下で、実行パスに “SysWOW64” が含まれているか
is32BitProcess = False
If is64BitOS Then
If InStr(1, WScript.FullName, “SysWOW64”, vbTextCompare) > 0 Then
is32BitProcess = True
End If
End If
‘ 3. 64bitOSなのに32bitプロセスで動いている場合、ネイティブの64bit版へリラウンチ
If is64BitOS And is32BitProcess Then
‘ 64bitネイティブのcscript.exeのパスを構築
‘ %windir%\Sysnative は、32bitプロセスから見た真の64bitシステムフォルダへの窓口
cscriptPath = shell.ExpandEnvironmentStrings(“%windir%”) & “\Sysnative\cscript.exe”
‘もしSysnativeが使えない環境(古いOS等)へのフォールバック
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(cscriptPath) Then
cscriptPath = shell.ExpandEnvironmentStrings(“%windir%”) & “\System32\cscript.exe”
End If
‘ 自分自身のスクリプトパスと、渡された引数をそのまま引き継いで再起動
Dim args, arg, cmd
args = “”
For Each arg In WScript.Arguments
args = args & ” “”” & arg & “”””
Next
‘ //nologoをつけてスマートに再起動実行
cmd = “””” & cscriptPath & “”” //nologo “”” & WScript.ScriptFullName & “””” & args
‘ 64bit版で実行し直す
shell.Run cmd, 1, False
‘ 自分自身の32bitプロセスはここで綺麗に終了
WScript.Quit
End If
End Sub
—
4. コードのここがポイント!エンジニアの知見
このコードには、VBScriptを極めた者ならではのテクニックが隠されています。
- `%windir%\Sysnative` という魔法のパス
32bitプロセスから普通の `System32` を指定すると、Windowsの親切心(リダイレクト)が働いて `SysWOW64` に飛ばされてしまいます。しかし、`Sysnative` という特殊な仮想フォルダを指定すると、Windowsは「おっ、分かっているな」と察して、本来の真の64bit版 System32へ案内してくれます。これがこのコードの核心です。
- 引数の完全継承
元のスクリプトがコマンドライン引数(`/user:xxx` や `file.txt` など)を受け取っていた場合でも、ループ処理でそのまま新しいプロセスへ引き継ぐように設計しています。そのため、ユーザーは環境が変わったことに気づきません。
—
まとめ:ここをクリアすればVBScriptの基本はバッチリ!
今回は、SysWOW64とSystem32のリダイレクトという、多くのエンジニアが一度はハマる深い沼を、スマートに回避するフレームワークを解説しました。
一見難しそうに見えますが、「スクリプトの先頭にこのプロファイル診断を挟んでおく」というルールさえ作ってしまえば、今後はレジストリ操作や高度なファイル操作も、エラーに怯えることなく安心して実装できるようになります。
現場で「あれ、うまく動かないな?」と思ったときは、自分が今どちらの世界(32bitか64bitか)にいるのかを思い出してみてください。
この知見をあなたの武器にして、より堅牢でスマートな自動化スクリプトを作り上げてくださいね!応援しています!
