こんにちは。現場で泥臭く、かつエレガントな自動化を追求し続けているエンジニアです。
VBScriptを触っていると、必ずぶち当たる壁があります。「なぜ、他の言語にはある『インクルード(外部ファイルの読み込み)』機能が、VBScriptには標準で用意されていないのか?」と。
コピペで同じ関数を何十個ものファイルに貼り付け、修正のたびに全ファイルを書き換える……。そんな「地獄の保守」からあなたを救い出し、VBScriptを真のプログラミング言語へと昇華させる「動的インクルード」の極意を伝授しましょう。
—
なぜVBScriptには「インクルード」がないのか?
VBScriptは、もともと「手軽にOSを操作する」ために生まれた、極めてシンプルな言語です。そのため、コンパイルという概念がなく、ファイルが読み込まれた瞬間に上から順番に実行されます。
本来、言語仕様にはないのですが、`Execute` と `ExecuteGlobal` という、極めて強力な「禁断の魔法」を使うことで、私たちは擬似的に外部ライブラリを組み込むことができるのです。
—
魔法の呪文:Execute と ExecuteGlobal
この二つは、文字列として渡されたコードを「その場で実行する」命令です。
- `Execute`: ローカルスコープ(関数内)で実行します。変数の有効範囲はその関数内に限定されます。
- `ExecuteGlobal`: グローバルスコープで実行します。ここで読み込んだ関数や変数は、スクリプト全体のどこからでも呼び出せるようになります。
これこそが、共通ライブラリを構築するための鍵です。
—
実践:共通ライブラリの動的インクルード・システム
まずは、共通機能をまとめたファイル(`Common.vbs`)を作成しましょう。
1. 共通ライブラリファイル (`Common.vbs`)
ここに、よく使う関数を詰め込みます。
‘ Common.vbs
‘ ここには関数だけを記述します
Public Function SayHello(name)
SayHello = “こんにちは、” & name & “さん!”
End Function
Public Function GetDateString()
GetDateString = Year(Now) & “年” & Month(Now) & “月” & Day(Now) & “日”
End Function
2. メインスクリプトからの読み込み
次に、メインのスクリプトからこのファイルを読み込むための「ローダー」を書きます。
‘ Main.vbs
Dim fso, scriptPath, libCode
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 現在のディレクトリにあるCommon.vbsを読み込む
scriptPath = fso.GetParentFolderName(WScript.ScriptFullName) & “\Common.vbs”
If fso.FileExists(scriptPath) Then
‘ ファイルの中身を文字列として読み込む
libCode = fso.OpenTextFile(scriptPath, 1).ReadAll
‘ 【重要】ExecuteGlobalでメモリ上に展開する
ExecuteGlobal libCode
‘ これで、Common.vbs内の関数がメインスクリプトの一部として認識される!
WScript.Echo SayHello(“エンジニア”)
WScript.Echo “今日は ” & GetDateString() & ” です。”
Else
WScript.Echo “ライブラリが見つかりません。”
End If
—
現場で陥りやすい「罠」と解決策
この手法は強力ですが、注意点もあります。
1. 変数のスコープ汚染
`ExecuteGlobal` は、ライブラリ内の変数をすべてグローバル変数として展開してしまいます。ライブラリ側で安易に変数宣言をすると、メインスクリプトの変数と衝突してバグを生みます。
- 対策: ライブラリ内では「関数(Function)」と「定数(Const)」のみを定義し、変数は使用しないように設計しましょう。
2. デバッグの難しさ
`ExecuteGlobal` で読み込んだコードは、エラーが発生した際に「どの行か」が特定しにくい場合があります。
- 対策: 開発中は、小規模な関数単位でテストを繰り返すこと。また、`On Error Resume Next` を乱用せず、必ずエラーハンドリングを意識してください。
3. パスの指定
`WScript.ScriptFullName` を使って、必ず「実行ファイルからの相対パス」で指定するようにしてください。Cドライブ直下などに決め打ちすると、配布した瞬間に動かなくなります。
—
まとめ:ここをクリアすれば、あなたはもう脱・初心者
今回紹介した「動的インクルード」を習得すれば、あなたの書くコードは「使い捨てのメモ書き」から「保守可能なソフトウェア」へと進化します。
1. 共通関数を `Common.vbs` に隔離する。
2. `FSO`(FileSystemObject)で中身を読み込む。
3. `ExecuteGlobal` でシステムに注入する。
この3ステップが、VBScriptにおける「大規模開発の作法」です。
最初は魔法のように感じるかもしれませんが、一度仕組みを理解すれば、これほど頼もしい相棒はいません。ぜひ、あなたの現場のコードでも試してみてください。
何か分からないことがあれば、またいつでも聞きに来てくださいね。応援しています!
