【実務・中級編】【動的コード実行】Execute と ExecuteGlobal を利用した自作共通ライブラリの動的インクルード手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:`ExecuteGlobal`で実現する「真のモジュール化」と堅牢な設計術

VBScriptという言語は、現代の開発環境から見れば確かに「化石」かもしれない。しかし、Windows環境でゼロから環境構築をせずとも即座に業務自動化を完遂できるその「即応性」は、今なお唯一無二だ。

多くの開発者が、VBScriptでの開発において「コードの重複」と「メンテナンスの地獄」に直面している。ある業務スクリプトを修正するたびに、同じロジックをコピー&ペーストした他の10個のファイルを開く……。そんな前時代的な運用は今日で終わりにしよう。

今回は、VBScriptで標準サポートされていない「インクルード」を、`ExecuteGlobal`を用いて安全かつ堅牢に実装する手法を伝授する。

1. なぜ「コピペ」がシステムを殺すのか

VBScriptの運用で最も致命的なのは、「共通関数の修正漏れ」だ。
`Utility.vbs`のような共通ライブラリを作らず、スクリプトごとにロジックを埋め込む手法は、修正が必要になった瞬間にバグの温床となる。

VBScriptには、言語仕様として`#include`のようなプリプロセッサが存在しない。そこで登場するのが `ExecuteGlobal` だ。これは、文字列として渡されたVBScriptコードを、現在の実行コンテキスト内で評価・実行する強力な武器である。

2. 堅牢なインクルード・エンジンの設計

単にファイルを読み込んで `ExecuteGlobal` に流し込むだけでは、パスの不整合やファイルロック、エラーハンドリングの欠如によりシステムが崩壊する。以下の設計パターンをプロダクションコードとして採用せよ。

実装例:`Loader.vbs`(インクルード管理用テンプレート)

‘ — 共通ライブラリをロードするための堅牢なラッパー —
Public Sub Include(strFilePath)
Dim objFSO, objFile, strCode

Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ パスの解決:絶対パスで指定することを推奨(相対パスはカレントディレクトリに依存するため危険)
If Not objFSO.FileExists(strFilePath) Then
Err.Raise 1001, “Include”, “ライブラリが見つかりません: ” & strFilePath
End If

‘ ファイルを読み込み
Set objFile = objFSO.OpenTextFile(strFilePath, 1) ‘ 1 = ForReading
strCode = objFile.ReadAll
objFile.Close

‘ ExecuteGlobalでコンテキストに展開
‘ これにより、共通ライブラリ内の関数が現在のスクリプトから直接呼出可能になる
ExecuteGlobal strCode

Set objFile = Nothing
Set objFSO = Nothing
End Sub

3. 実務で「事故」を起こさないための3つの鉄則

`ExecuteGlobal`は強力だが、使い方を誤ればデバッグ不能なコードを生成する。以下のルールを厳守せよ。

① スコープの汚染を避ける

`ExecuteGlobal`で読み込まれた変数はグローバルスコープを汚染する。共通ライブラリ内では、可能な限り `Private` な変数を利用し、名前空間の衝突(Namespace Collision)を避ける設計にすること。関数名は `Lib_FunctionName` のようにプレフィックスを付けるのが賢明だ。

② ファイルロックと読み取り専用モード

`OpenTextFile` を開く際は、必ず読み取り専用モード(`1`)を指定すること。書き込みモードで開いてしまい、スクリプト実行中にファイルがロックされると、自動化プロセスが止まる原因となる。

③ エラーハンドリングの境界

`ExecuteGlobal`内でエラーが発生した場合、スタックトレースが追いづらくなる。インクルードするライブラリ側には、必ず `On Error Resume Next` を活用した局所的なエラーハンドリングを実装し、呼び出し元にエラーを正しく伝播させろ。

4. プロダクション環境での運用イメージ

メインのスクリプトは以下のようにスッキリとさせるのが、一流のコードだ。

‘ Main.vbs
‘ 共通ライブラリのパス(環境変数や構成ファイルから読み込むのがベスト)
Include “C:\Library\CommonUtils.vbs”
Include “C:\Library\DatabaseLib.vbs”

‘ あとは普通に呼ぶだけ
If Lib_IsConnectedToDB() Then
Call ProcessAutomation()
End If

最後に:なぜ「今」これを学ぶべきか

VBScriptはレガシーかもしれない。しかし、この「動的インクルード」という概念は、将来的にPowerShellやPython、あるいはNode.jsへと移行する際にも通じる「設計思想」の基礎となる。

コードのモジュール化は、単なる効率化ではない。「変更に対するコストを最小化し、将来の自分を助けるための投資」だ。

今日からコピペをやめ、`ExecuteGlobal`で自分だけの最強ライブラリを構築せよ。それができるエンジニアこそが、現場で最も重宝される存在となる。

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