【実務・中級編】【スクリプト自身パス確定】WScript.ScriptFullName と InStrRev を用いたカレントディレクトリ依存脱却ロジック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:カレントディレクトリの罠を排除する「絶対パス解決」の極意

業務自動化の現場で、VBScriptは依然として「最強の即効薬」だ。しかし、多くのエンジニアが初心者の域を脱せない理由がある。それは、「カレントディレクトリ」という名の泥沼に足を取られているからだ。

「ショートカットから実行すると動くのに、バッチファイルから呼ぶとファイルが見つからない」。
そんな現象に頭を抱えたことはないか? もし君がそうなら、今すぐコードの書き方を改める必要がある。

今日は、WSHにおけるパス解決の「絶対解」を叩き込む。

なぜ「カレントディレクトリ」に頼ってはいけないのか

VBScriptにおける `.` (カレントディレクトリ)は、「スクリプトがどこにあるか」ではなく「どこから呼び出されたか」に依存する。

  • タスクスケジューラからの実行
  • バッチファイルからの呼び出し
  • ダブルクリックによる直接実行

これらが混在する環境で、相対パス(`.\config.ini`など)を多用すれば、実行のたびに「ファイル不在」のエラーに泣くことになる。プロダクション環境のコードにおいて、カレントディレクトリへの依存は「設計ミス」以外の何物でもない。

「スクリプト自身の配置場所」を確定させる唯一のロジック

我々が求めるべきは、実行元がどこであろうと「このスクリプトが配置されているディレクトリ」を起点にする強固な基盤だ。

ここで登場するのが `WScript.ScriptFullName` である。これに `InStrRev` を組み合わせることで、OSのパス構造を逆算して解析する。

実践:堅牢なパス解決の実装コード

この関数を共通ライブラリとして持っておけば、パスの悩みは一生消滅する。

‘ — 共通関数:スクリプト自身の絶対パスを確実に取得する —
Function GetScriptDirectory()
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ WScript.ScriptFullName はスクリプトのフルパスを返す
‘ InStrRev で右から最初の “\” を検索し、それより前の文字列を切り出す
GetScriptDirectory = fso.GetParentFolderName(WScript.ScriptFullName)

Set fso = Nothing
End Function

‘ — 実装例:設定ファイルの読み込み —
Dim strConfigPath, fso, objFile
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 確実にスクリプトと同じフォルダ内の設定ファイルを指定する
strConfigPath = GetScriptDirectory() & “\config.ini”

If fso.FileExists(strConfigPath) Then
WScript.Echo “成功: 設定ファイルを特定しました -> ” & strConfigPath
Else
WScript.Echo “致命的エラー: 設定ファイルが見つかりません -> ” & strConfigPath
WScript.Quit 1
End If

Set fso = Nothing

アーキテクトの視点:なぜこれが「プロのコード」なのか

1. 依存関係の断絶

このコードは、実行元のパス状況を一切気にしない。スクリプトを別のフォルダに移動させても、あるいはドライブレターが変わっても、`GetParentFolderName` は常にスクリプト自身の物理的な位置を特定する。

2. FileSystemObject (FSO) の適切な活用

`InStrRev` を使って文字操作でパスを切り出すことも可能だが、私は `FileSystemObject` のメソッドを推奨する。なぜなら、OSのパスセパレータの差異や、不正なパス文字の扱いにおいて、FSOは標準ライブラリとして最も堅牢だからだ。

3. 保守性の担保

パスをハードコーディングしているコードは、ディレクトリ構成を変更した瞬間にゴミと化す。このロジックをテンプレート化しておけば、保守コストは最小化される。

現場で成果を出すための注意点

  • UNCパスへの配慮: ネットワークドライブ上のスクリプトを扱う場合、`ScriptFullName` は正しくUNCパス(`\\server\share\…`)を返す。このロジックはネットワーク越しでも問題なく機能する。
  • ログ出力との連携: ログファイルを書き出す際は、必ずこの `GetScriptDirectory()` を使い、`\logs` フォルダを生成してその中に配置する設計にせよ。ルートディレクトリを汚すのは素人のやることだ。
  • 権限の考慮: 指定のフォルダに書き込み権限がない場合、`FSO` は実行時エラーを吐く。エラーハンドリング(`On Error Resume Next`)を適切に行い、ユーザーに分かりやすいメッセージを返すのが、業務エンジニアとしての礼儀である。

最後に

VBScriptは古い言語かもしれない。だが、その挙動を完全に制御下に置くことは、モダンな言語を扱う上での「論理的思考」の基礎訓練になる。

カレントディレクトリという不確実な変数に頼るのをやめ、コード自身に居場所を教え込ませろ。それが、君の作成する自動化ツールが「信頼されるシステム」へと昇華するための第一歩だ。

さあ、コードを書き換えろ。次からは、どんな環境から叩かれても動く強固なロジックがそこにあるはずだ。

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