VBScriptを掌握する極限の知見:パス区切り文字の「迷宮」を断ち切る堅牢なパーサー設計
現場で「なぜかファイルが見つからない」「Web API連携でパスが壊れる」というトラブルに直面したことはないか?その原因の9割は、Windowsのバックスラッシュ(`\`)とUNIX系のスラッシュ(`/`)が混在した「汚染されたパス」だ。
VBScriptは枯れた技術だが、枯れているからこそ、OSの境界線を跨ぐ際の「生データ」の扱いに無頓着になりやすい。この記事では、場当たり的な置換コードを卒業し、プロダクション環境で耐えうる「堅牢なパス・正規化関数」の実装術を伝授する。
—
1. なぜ「単純な置換」では失敗するのか
多くのエンジニアは `Replace(path, “\”, “/”)` といった単純な置換を繰り返す。しかし、これは以下の罠に陥る。
- 二重区切り文字の放置: `C:\\Users//Name` のようなゴミが残る。
- 末尾の区切り文字問題: Web APIに投げる際、末尾の `/` の有無でエンドポイントの挙動が変わるケースが多い。
- UNCパスの破壊: ネットワークドライブの `\\Server\Share` を `/Server/Share` に変換すると、Windowsのネットワークリゾルバが沈黙する。
真のエンジニアは、「置換」ではなく「パース(解析)と再構築」を行う。
—
2. 実装コード:堅牢なパス変換パーサー
以下は、引数でターゲットOSを指定し、パスを安全に整形する実用的な関数だ。このままライブラリとして組み込んでほしい。
‘——————————————————————————-
‘ 関数名: NormalizePath
‘ 概要: OSの境界を越えるためのパス正規化・変換ユーティリティ
‘ 引数:
‘ strPath – 変換対象のパス文字列
‘ blnToUnix – Trueならスラッシュ(/)統一、Falseならバックスラッシュ(\)統一
‘——————————————————————————-
Function NormalizePath(ByVal strPath, ByVal blnToUnix)
Dim strResult, strDelimiter
If blnToUnix Then
strDelimiter = “/”
strResult = Replace(strPath, “\”, “/”)
Else
strDelimiter = “\”
strResult = Replace(strPath, “/”, “\”)
End If
‘ 連続する区切り文字を1つに統合 (例: // -> /)
‘ 正規表現オブジェクトを使用してスマートに処理する
Dim objRegex
Set objRegex = CreateObject(“VBScript.RegExp”)
objRegex.Global = True
objRegex.IgnoreCase = True
‘ 区切り文字の連続を1つに置換
objRegex.Pattern = “[” & strDelimiter & “]{2,}”
strResult = objRegex.Replace(strResult, strDelimiter)
‘ 末尾の区切り文字削除(必要に応じて調整可能)
‘ API連携では「末尾なし」が基本ルールであることが多いため
If Len(strResult) > 1 And Right(strResult, 1) = strDelimiter Then
strResult = Left(strResult, Len(strResult) – 1)
End If
NormalizePath = strResult
End Function
‘ — 使用例 —
Dim rawPath, cleanPath
rawPath = “C:\Users\\Data//test_file.csv”
‘ Linux向け(スラッシュ統一)
cleanPath = NormalizePath(rawPath, True)
WScript.Echo “UNIX用: ” & cleanPath ‘ 出力: C:/Users/Data/test_file.csv
—
3. 現場で生き残るための「設計の勘所」
1. 正規表現エンジンを使い倒せ
VBScriptの `Replace` 関数は単純だが、構造化されたデータには不向きだ。今回のように「特定の文字の連続」を制御する場合、`VBScript.RegExp` オブジェクトをインスタンス化するオーバーヘッドを惜しんではいけない。パフォーマンスを気にするなら、関数の外でオブジェクトを生成し、静的クラスのように扱うアーキテクチャを採用すべきだ。
2. 「UNCパス」の例外処理を忘れるな
Windowsのネットワークパス `\\Server\Share` は、`\` を全て `/` に変換すると無効になることがある。もしUNCパスを扱う必要があるなら、冒頭の `\\` を保持するロジックを条件分岐で追加せよ。
3. API連携時のエンコーディング
パスを変換した後に `EncodeURIComponent` 相当の処理が必要な場合が多い。ファイル名にスペースや日本語が含まれている場合、変換したパスをそのままURLパラメータに突っ込むと、Webサーバー側で 400 Bad Request を食らう。
パス変換の直後に `Server.URLEncode` (ASP環境) または、独自のエンコード関数を通すパイプラインを設計しておくことが、手戻りを防ぐ唯一の道だ。
—
最後に:なぜVBScriptなのか
「今さらVBScriptか」という声は聞こえる。しかし、Windowsの自動化業務において、OS標準で即座に動作し、コンパイル不要で修正が効くこの言語は、依然として最強の機動力を持っている。
「動けばいい」コードを書くのは素人だ。
「環境が汚れていても、意図した通りにデータを運ぶ」コードこそが、チーフアーキテクトが目指すべき『解』である。このパーサーを君のツールキットの基盤に組み込み、トラブルに怯える日々を終わらせてほしい。
