【実務・中級編】【引数パス標準化】WScript.Arguments の囲みダブルクォーテーション自動除去と末尾記号補正モジュール – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する極限の知見:【引数パス標準化】WScript.Arguments の囲みダブルクォーテーション自動除去と末尾記号補正モジュール

プロフェッショナルな現場において、VBScriptは今なお「インフラに依存せず即座に動く最強の軽量自動化ツール」として君臨している。特にタスクスケジューラからのバッチ実行や、オペレーターによるデスクトップ上のスクリプトアイコンへの「ドラッグ&ドロップ(D&D)」運用において、その機動力は他の追随を許さない。

しかし、ここで多くの開発者が罠に嵌まる。
それが、`WScript.Arguments` が内包する「パスの解釈の揺れ」である。

今回は、数々の現場でシステム障害を引き起こしてきた「パスの二重引用符問題」と「末尾バックスラッシュの有無」を完全に無力化し、プロダクション環境で耐えうる堅牢な引数標準化モジュールの設計思想と実装を伝授する。

—

なぜ、素の `WScript.Arguments` は業務自動化で使い物にならないのか?

D&Dやコマンドライン経由でパスをスクリプトに渡す際、OS(WSHホスト)はそのパスに半角スペースや特殊文字が含まれている場合、自動的に前後をダブルクォーテーション(`”`)で囲んで渡してくる。

ここで愚直なプログラマブルエラーが発生する。

‘ 【悪手】引数をそのままファイルシステム操作に渡す愚行
Dim targetPath
targetPath = WScript.Arguments(0)

‘ パスの中にスペースが含まれており、D&Dされた場合:
‘ targetPath の中身は “C:\My Folder\data.txt” となる(両端に ” が残る)
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.OpenTextFile targetPath, 1 ‘ -> 致命的なエラー:ファイルが見つかりません (Path not found)

さらにタチが悪いのは、「スペースが含まれないパス」の場合はダブルクォーテーションが付与されないという非対称性だ。これにより、テスト環境(スペースなしパス)では完璧に動くのに、本番環境(スペースありの共有フォルダパス等)に展開した途端に沈黙する、最悪の「環境依存バグ」が完成する。

また、フォルダパスを扱う際、末尾に `\`(バックスラッシュ・円マーク)がついているかないかによって、後続の `FolderPath & “\filename.ext”` という文字列結合処理で `C:\Logs\\file.txt` のような「二重スラッシュ事故」が頻発する。

これらをすべて吸収し、「いかなる入力を受けても、泥臭く、美しく正規化された絶対パスを返す」防壁を築く必要がある。

—

堅牢なパス標準化モジュールの設計要件

プロフェッショナルが書くべきモジュールは、以下の要件を満たさなければならない。

1. 両端ダブルクォーテーションの確実な剥離
単なる `Replace` では、ファイル名やフォルダ名の中間にあるクォーテーションまで破壊する恐れがあるため、「先頭と末尾が `”` で囲まれている場合のみ」除去する厳密なトリミングを行う。
2. 末尾バックスラッシュのコントロール
フォルダパスを扱う場合、末尾に必ず `\` を付与する(あるいは完全に排除する)モードを選択できるようにする。
3. オブジェクトのライフサイクル管理
FileSystemObject(FSO)などのCOMコンポーネントを不必要に乱立させず、メモリリークやパフォーマンス低下を防ぐ。

—

【実装】プロダクションコード:`NormalizePathModule.vbs`

以下のコードは、実務の現場でそのままインクルード、あるいはメインスクリプトに組み込んで即座に利用できる、洗練されたパス標準化の決定版である。

‘ ==============================================================================
‘ Module Name: NormalizePathModule.vbs
‘ Description: WScript.Argumentsの引用符自動除去および末尾パス区切り文字補正
‘ Author: Enterprise Automation Architect
‘ ==============================================================================

Option Explicit

‘ — テスト実行用のメインルーチン(モジュール単体テスト) —
Call Main()

Sub Main()
Dim rawArg, normalizedPath

‘ テストケース1: 両端にダブルクォーテーションがあり、末尾スラッシュがない場合
rawArg = “””C:\WorkSpace\Project Alpha\data.txt”””
normalizedPath = NormalizeFilePath(rawArg)
WScript.Echo “【ファイルパス標準化】” & vbCrLf & _
“入力: ” & rawArg & vbCrLf & _
“出力: ” & normalizedPath & vbCrLf

‘ テストケース2: フォルダパスで末尾スラッシュを強制付与する場合
rawArg = “D:\ShareFolder\Logs”
normalizedPath = NormalizeFolderPath(rawArg, True)
WScript.Echo “【フォルダパス標準化(末尾付与)】” & vbCrLf & _
“入力: ” & rawArg & vbCrLf & _
“出力: ” & normalizedPath & vbCrLf
End Sub

‘ ==============================================================================
‘ 関数名: NormalizeFilePath
‘ 概要: ファイルパスの囲みダブルクォーテーションを除去し、トリムする
‘ 引数: ByVal rawPath As String (処理前の生パス文字列)
‘ 戻り値: String (標準化されたパス)
‘ ==============================================================================
Public Function NormalizeFilePath(ByVal rawPath)
Dim cleaned
cleaned = Trim(rawPath)

‘ 文字列がダブルクォーテーションで囲まれているか厳密に判定
If Len(cleaned) >= 2 Then
If Left(cleaned, 1) = “””” And Right(cleaned, 1) = “””” Then
‘ 中間部分のみを抽出(両端の ” を削ぎ落とす)
cleaned = Mid(cleaned, 2, Len(cleaned) – 2)
End If
End If

NormalizeFilePath = Trim(cleaned)
End Function

‘ ==============================================================================
‘ 関数名: NormalizeFolderPath
‘ 概要: フォルダパスの引用符除去に加え、末尾の ‘\’ の有無を統一する
‘ 引数: ByVal rawPath As String (処理前の生パス)
‘ ByVal ensureTrailingSlash As Boolean (True:末尾に\を付ける, False:取り除く)
‘ 戻り値: String (標準化されたフォルダパス)
‘ ==============================================================================
Public Function NormalizeFolderPath(ByVal rawPath, ByVal ensureTrailingSlash)
Dim cleaned

‘ まず基本のファイルパス側ロジックで引用符を除去
cleaned = NormalizeFilePath(rawPath)

‘ パスが空の場合はそのまま返す
If cleaned = “” Then
NormalizeFolderPath = “”
Exit Function
End If

‘ 末尾文字の制御
If ensureTrailingSlash Then
If Right(cleaned, 1) <> “\” Then
cleaned = cleaned & “\”
End If
Else
If Right(cleaned, 1) = “\” And Len(cleaned) > 3 Then ‘ “C:\” のようなルート直下の場合は残す配慮
cleaned = Left(cleaned, Len(cleaned) – 1)
End If
End If

NormalizeFolderPath = cleaned
End Function

—

ジニアスな開発者であればお気づきだろうが、上記のコードは単なる文字列操作に留まらない。`Len(cleaned) > 3` によるルートドライブ(`C:\` 等)の誤削ぎ落とし防止など、実務で実際に踏みがちな地雷を踏み抜かないための「防衛的プログラミング(Defensive Programming)」の哲学がコードの隅々にまで宿っている。

—

開発現場への導入と運用上の注意点

1. インクルード機構の欠如への対策
VBScriptには標準で `#include` のようなプリプロセッサが存在しない(WSHの制限)。共通関数として利用する場合は、別ファイル(`Lib.vbs`など)に切り出し、`ExecuteGlobal` とファイル読み込みを組み合わせるか、各スクリプトの冒頭にこのサブルーチン群を標準テンプレートとして組み込んで運用するのが現実的かつ堅牢である。
2. データベース・ログ連携時のエスケープ
標準化されたパスは非常にクリーンになるが、これをそのままSQLのクエリ文字列に埋め込んだり、CSV出力の要素として使う場合は、シングルクォーテーション(`’`)やカンマが含まれるリスクへの配慮(プリペアドステートメントの使用やダブルクォーテーション囲み)を忘れてはならない。パスの「正規化」は、あくまで「ファイルシステムと正しく対話するため」の第一歩に過ぎないのだ。

結言

VBScriptの寿命は、そのシンプルさとレガシーシステムとの親和性ゆえに、まだまだ尽きることがない。だからこそ、稚拙なコードで溢れかえるか、洗練されたプロフェッショナルコードで鉄壁の自動化基盤を築くかは、アーキテクトの腕一つにかかっている。

「たかがパスの受け渡し」と侮るなかれ。この微小な揺れを完全に制御することこそが、止まらない業務システムの絶対条件である。

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