こんにちは!VBScriptの世界へようこそ。
業務自動化の現場で、デスクトップ上のファイルを「スポッ」とVBScriptのアイコンにドラッグ&ドロップして処理させたい――そんなシーンはよくありますよね。
でも、実際にやってみると、「パスにスペースが含まれていると前後にダブルクォーテーション(`”`)が勝手につく」「フォルダをドラッグすると末尾にバックスラッシュ(`\`)がついたりつかなかったりする」という、地味で強烈な罠に直面したことはありませんか?
今回は、この「パスの揺れ」を完全に飼い慣らし、後続のファイル操作エラーを根絶するための「引数パス標準化モジュール」を一緒に作っていきましょう。
ここをクリアすれば、WSH(Windows Script Host)を駆使した自動化スクリプトの基礎はバッチリです!優しく丁寧に解説していくので、安心してついてきてくださいね。
—
1. なぜパスの「標準化」が必要なのか?(WScript.Argumentsの罠)
VBScriptでコマンドライン引数を受け取る時、私たちは `WScript.Arguments` というオブジェクトを使います。しかし、このオブジェクトが渡してくる文字列には、Windowsのシェル(エクスプローラー)の仕様による「お節介」が隠されています。
罠の正体:余計なダブルクォーテーション
例えば、`C:\My Folder\report.xlsx` という、スペースを含むパスのファイルをVBScriptにドラッグ&ドロップしたとします。
Windowsはファイルパスが途中で切れないように、自動的にダブルクォーテーションで囲んでスクリプトに渡します。つまり、VBScript側が受け取る文字列はこうなります。
“C:\My Folder\report.xlsx”
このまま `FileSystemObject` にパスを渡してファイルを開こうとすると、「そんな名前のファイルはありません」とエラー(Runtime Error)になってしまうのです。
さらに面倒な「末尾のバックスラッシュ問題」
フォルダをドラッグ&ドロップした場合、環境や取得方法によって末尾に `\` がついたりつかなかったりします。後続の処理で `strPath & “\filename.ext”` のようにファイル名と結合するとき、`\` が二重になってしまったり(`C:\Folder\\filename.ext`)、逆に漏れたりする原因になります。
—
2. 解決策:引数パス標準化モジュールの全貌
それでは、これらの「揺れ」を完璧に吸収し、常に美しく安全なパスに整えてくれる実用的なスクリプトを見てみましょう。
以下のコードをメモ帳などに貼り付け、拡張子を `.vbs`(例: `NormalizePathSample.vbs`)にして保存してください。
‘ =================================================================0
‘ 模範スクリプト: 引数パス標準化モジュール
‘ 概要: ドラッグ&ドロップされたパスの前後クォーテーション除去と
‘ 末尾のバックスラッシュ制御を確実に行うプロフェッショナル実装
‘ =================================================================Option Explicit
‘ メイン処理の実行
Call Main()
Sub Main()
Dim objArgs, i, rawPath, cleanPath
Set objArgs = WScript.Arguments
‘ 引数が渡されていない場合のガード
If objArgs.Count = 0 %> Then
MsgBox “ファイルをこのスクリプトアイコンにドラッグ&ドロップしてください。”, vbExclamation, “パス標準化サンプル”
Exit Sub
End If
‘ 渡されたすべての引数をループ処理(複数同時ドロップに対応)
For i = 0 To objArgs.Count – 1
rawPath = objArgs(i)
‘ 【重要】ここでパスを完璧に標準化する!
‘ 第2引数: True = 末尾に必ず「\」を付与する(フォルダ用などの場合)
‘ False = 末尾の「\」を必ず削除する(ファイル用などの場合)
cleanPath = StandardizePath(rawPath, False)
‘ 結果を確認(実務ではここに後続の処理を記述します)
MsgBox “【変換前】” & vbCrLf & rawPath & vbCrLf & vbCrLf & _
“【標準化後(ファイル用)】” & vbCrLf & cleanPath, vbInformation, “パス標準化デモ”
Next
Set objArgs = Nothing
End Sub
‘ =================================================================
関数名: StandardizePath
機能: パスの両端のダブルクォーテーションを除去し、末尾のセパレータを制御する
引数:
ByVal originalPath As String : 処理前の生パス
ByVal ensureBackslash As Boolean : True(末尾に\を付く), False(末尾の\を取る)
戻り値:
String : 標準化されたクリーンなパス
= =================================================================
Function StandardizePath(ByVal originalPath, ByVal ensureBackslash)
Dim result
result = originalPath
‘ 1. 前後の空白をトリム
result = Trim(result)
‘ 2. 先頭がダブルクォーテーションで始まっていたら除去
If Left(result, 1) = “””” Then
result = Mid(result, 2)
End If
‘ 3. 末尾がダブルクォーテーションで終わっていたら除去
If Right(result, 1) = “””” Then
result = Left(result, Len(result) – 1)
End If
‘ 4. もう一度念のため前後の空白をトリム
result = Trim(result)
‘ 5. 末尾のバックスラッシュ(\)の有無を制御
If result <> “” Then
If ensureBackslash Then
‘ 末尾に必ず「\」が存在する状態にする
If Right(result, 1) <> “\” Then
result = result & “\”
End If
Else
‘ 末尾の「\」を完全に排除する(ただしドライブ直下 “C:\” は保護する)
If Right(result, 1) = “\” And Len(result) > 3 Then
result = Left(result, Len(result) – 1)
End If
End If
End If
StandardizePath = result
End Function
—
3. コードの注目ポイントと知見の解説
ただ動くだけではなく、「なぜこのような書き方をしているのか?」というエンジニアリングの極意をいくつか解説します。
① `ByVal` による値渡しの徹底
VBScriptの関数引数はデフォルトで `ByRef`(参照渡し)になっています。意図せず呼び出し元の変数が書き換わってしまうバグを防ぐため、このモジュールでは `ByVal originalPath` と明示的に値渡しを指定しています。これは堅牢なコードを書くための必須テクニックです。
② 四隅を削る安全なクォーテーション除去
単に `Replace(result, “”””, “”)` と書いてしまうと、パスの途中に万が一ダブルクォーテーションが含まれていた場合(そんなパスは滅多にありませんが)にまで破壊されてしまいます。
信頼性の高いプログラミングでは、「先頭が `”` ならば `Mid` で2文字目以降を取り出す」「末尾が `”` ならば `Left` で最後尾を削る」という厳格なインデックス操作を行います。
③ ドライブ直下(`C:\` など)の保護
フォルダパスの末尾整理を行う際、`C:\` のようなドライブ直下のパスから `\` を奪ってしまうと、後続処理で `C:` となり、カレントディレクトリ依存のバグを引き起こす原因になります。
コード内の `Len(result) > 3` という条件分岐は、「ドライブ文字+コロン+バックスラッシュ(計3文字)」よりも長い場合のみ末尾の `\` を削るという、現場の修羅場をくぐり抜けてきた知見に基づくガード処理です。
—
4. まとめ:VBScriptの基本は「入力の不確実性」との戦い
今回は、WScript.Argumentsを使った引数パスの標準化について解説しました。
- ドラッグ&ドロップの引数にはダブルクォーテーションが混ざることを前提にする
- ファイルパスを扱うときは末尾の `\` を意図通りにコントロールする
- 関数内では `ByVal` を使って安全性を高める
ここをクリアできれば、あなたの書くVBScriptは「一発ネタのマクロ」から、現場で安心して何年でも動き続ける「堅牢な自動化ツール」へと劇的に進化します。
ぜひ、ご自身の業務自動化スクリプトにこのモジュールを組み込んで、快適なVBScriptライフを送ってくださいね!それでは、次の極知見でお会いしましょう。
