【実務・中級編】【絶対パス相互変換ロジック】FSOに依存せず相対パス(../や./)を正確な絶対パスに展開する標準文字列パース関数 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:FSOに頼らない「相対パス解決」の極意

業務自動化の現場において、`FileSystemObject` (FSO) は確かに強力な武器だ。しかし、真のエンジニアであれば知っているはずだ。「FSOは、パスを物理的に検証しようとする」という特性が、時に巨大な落とし穴になることを。

ネットワークドライブの遅延、アクセス権限のないディレクトリへの干渉、あるいは一時的なファイル存在確認によるパフォーマンスの低下。これらを回避し、純粋な文字列処理だけで「相対パス(`../` や `./`)」を絶対パスへと変換するロジックこそ、堅牢なスクリプトを作るための必須教養である。

今回は、環境に依存せず、かつ高速にパスを解決する「純粋パース関数」の設計を伝授する。

なぜFSOの `GetAbsolutePathName` を避けるべきか

多くの初学者は `fso.GetAbsolutePathName(path)` に頼る。だが、これは「現在実行中のプロセス(カレントディレクトリ)」に強く依存する。`Set objShell = CreateObject(“WScript.Shell”)` でカレントディレクトリを頻繁に変更するような複雑なツールでは、この挙動はバグの温床となる。

真に再利用可能なツールは、環境の状態に依存しない。 与えられた「基準パス」と「相対パス」から、論理的に絶対パスを算出するロジックを自前で持つべきだ。

極限のパス解決ロジック:`ResolvePath` 関数

以下のコードは、配列操作とスタックアルゴリズムを用いて、FSOの助けを一切借りずに相対パスを正規化する。

‘——————————————————————————-
‘ 関数名: ResolvePath
‘ 概要: FSOに依存せず、基準パスと相対パスから絶対パスを解決する
‘ 引数: baseDir – 基準となるディレクトリパス
‘ relPath – 解決対象の相対パス
‘ 戻り値: 正規化された絶対パス
‘——————————————————————————-
Function ResolvePath(baseDir, relPath)
Dim parts, part, stack

‘ 基準パスと相対パスを結合してスプリット
‘ パス区切り文字を統一(Windows環境前提)
Dim combinedPath
combinedPath = baseDir & “/” & Replace(relPath, “\”, “/”)
parts = Split(combinedPath, “/”)

‘ スタックをシミュレートする配列(最大サイズはパーツ数と同じ)
ReDim stack(UBound(parts))
Dim ptr : ptr = -1

Dim i
For i = 0 To UBound(parts)
part = parts(i)

‘ 空要素、または現在のディレクトリを示す”.”は無視
If part <> “” And part <> “.” Then
If part = “..” Then
‘ 親ディレクトリへ移動(スタックをポップ)
If ptr >= 0 Then ptr = ptr – 1
Else
‘ 通常のディレクトリ/ファイル名(スタックにプッシュ)
ptr = ptr + 1
stack(ptr) = part
End If
End If
Next

‘ 結果の構築
Dim result : result = “”
For i = 0 To ptr
result = result & stack(i) & “\”
Next

‘ 最後の “\” を除去して返す
If Len(result) > 0 Then
ResolvePath = Left(result, Len(result) – 1)
Else
ResolvePath = “”
End If
End Function

この設計が「現場」で強い理由

1. 副作用の完全排除
この関数は「文字列」のみを受け取り「文字列」を返す。ディスクI/Oが一切発生しないため、ネットワーク越しや権限制限のあるフォルダパスを扱う際も、エラーで止まることはない。
2. スタックアルゴリズムの採用
`..` を見つけた際に単純に文字列を置換するような安易なコードは、パスの深さが増すと論理破綻する。この実装は、スタック(LIFO)構造を利用しているため、どれほど複雑な `../../` の連鎖であっても正確に解決できる。
3. 移植性と保守性
VBScriptの標準機能のみで記述されているため、ActiveXコンポーネントのインストールや特定の権限設定に依存しない。これは、保守担当者が「とりあえずコピペで動く」状態を維持するために極めて重要だ。

実務での運用における注意点

  • ドライブ文字の扱い: 上記コードはUNCパス(`\\Server\Share\…`)やローカルパス(`C:\…`)を前提としている。もし相対パスがドライブレターから始まるような特殊なケースを扱う場合は、最初のパーツの処理にガード節を追加することをお勧めする。
  • データベース連携: データベースにパスを格納する際、環境によってパスが揺れると検索不能になる。必ずツール起動時にこの `ResolvePath` を通して「絶対パスの正規化」を行った上でクエリを投げるのが、トラブルを未然に防ぐ鉄則だ。

結び

VBScriptは古い言語と言われるが、その薄い抽象化レイヤーこそが、OSの挙動をダイレクトに制御する強力な武器になる。FSOに頼り切るのではなく、標準的な文字列処理を極めること。それこそが、何年経っても壊れない「エンジニアの資産」を築く唯一の方法だ。

さあ、あなたのスクリプトを、よりロジカルで、より堅牢なものへ進化させよう。

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