こんにちは!VBScriptの世界へようこそ。
業務自動化の現場で、ファイルやフォルダのパスを操作する処理に直面したことはありませんか?
「相対パスで指定されたファイルの、本当の場所(絶対パス)が知りたい」
「フルパスからファイル名だけ、あるいは親フォルダのパスだけをスマートに取り出したい」
こういう場面で、文字列の操作関数(`InStrRev`や`Mid`など)を使ってゴリゴリとコードを書いているとしたら……ちょっと待ってください。それ、実はFSO(FileSystemObject)を使えば、驚くほどエレガントに、そしてバグなく解決できるんです。
今回は、FSOのパス解析メソッドである `GetAbsolutePathName` と `GetParentFolderName`、そして周辺の強力な仲間たちを組み合わせて、ファイルパスを自由自在に解体・正規化する極意を伝授します。
ここをクリアすれば、あなたのファイル操作スキルは間違いなくプロの領域に到達しますよ。一緒にマスターしていきましょう!
—
1. なぜ「文字列操作」ではなく「FSOのパス解析」を使うべきなのか?
初学者がやりがちなのが、パス文字列を「ただの文字の羅列」として処理することです。
例えば、`C:\Data\Report.txt` からファイル名を取り出したいとき、「右から数えて最初のバックスラッシュ(`\`)を探して……」なんてコードを書いたことはありませんか?
しかし、これには大きな落とし穴があります。
- ドライブ直下(`C:\Report.txt`)だったらどうなる?
- スラッシュ(`/`)とバックスラッシュ(`\`)が混在していたら?
- 相対パス(`..\Data\Report.txt`)だったら?
こうしたOSのルールや例外処理を自前の文字列操作で全部カバーしようとすると、コードは泥沼化します。そこで登場するのが FileSystemObject (FSO) です。OS(Windows)のファイルシステムを熟知したAPIにパスの解釈をお任せすることで、どんな複雑なパスも一撃で、安全に処理できるようになります。
—
2. パス解析の主役たち:基本メソッドの全貌
FSOには、パスを料理するための専用包丁がいくつも用意されています。まずは今回の主役たちを確認しておきましょう。
| メソッド / プロパティ | 役割 | 具体例 |
| :— | :— | :— |
| `GetAbsolutePathName` | あいまいな相対パスを、完全な「絶対パス」に変換する | `.` $\rightarrow$ `C:\Work` |
| `GetParentFolderName` | パスから「親フォルダのパス」を切り出す | `C:\A\B\file.txt` $\rightarrow$ `C:\A\B` |
| `GetFileName` | パスから「ファイル名(拡張子付き)」を切り出す | `C:\A\B\file.txt` $\rightarrow$ `file.txt` |
| `GetExtensionName` | パスから「拡張子」だけを抜き出す | `C:\A\B\file.txt` $\rightarrow$ `txt` |
これらを組み合わせることで、どんなパスでも丸裸にすることができます。
—
3. 実践!パスを解体・正規化するスマートなコード
それでは、実際に動かせるVBScriptのコードを見てみましょう。
メモ帳などに貼り付けて、拡張子を `.vbs` にして実行してみてください。(デスクトップ等で実行すると、相対パスの動きがよく分かります)
‘ =================================================================0
‘ FSOを用いたパス解析・正規化のマスターサンプル
‘ =================================================================0
Option Explicit
Sub AnalyzeFilePath()
Dim fso, targetPath, absolutePath
‘ 1. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ テスト用のあいまいな相対パス(カレントディレクトリからの相対パス)
targetPath = “.\data\sample_report.csv”
WScript.Echo “— 【1. パスの正規化】 —”
WScript.Echo “指定された相対パス: ” & targetPath
‘ GetAbsolutePathName で絶対パスに変換(正規化)
‘ ※存在しないファイル・フォルダであっても、文字列として正しく絶対パスに変換してくれます
absolutePath = fso.GetAbsolutePathName(targetPath)
WScript.Echo “変換された絶対パス: ” & absolutePath
WScript.Echo “”
WScript.Echo “— 【2. パスの解体 (バラバラにする)】 —”
‘ ドライブ名の取得 (例: “C:”)
WScript.Echo “・ドライブ名: ” & fso.GetDriveName(absolutePath)
‘ 親フォルダ名の取得 (例: “C:\path\to\data”)
WScript.Echo “・親フォルダパス: ” & fso.GetParentFolderName(absolutePath)
‘ ファイル名の取得 (例: “sample_report.csv”)
WScript.Echo “・ファイル名: ” & fso.GetFileName(absolutePath)
‘ 拡張子の取得 (例: “csv”)
WScript.Echo “・拡張子: ” & fso.GetExtensionName(absolutePath)
‘ 拡張子を除いたベース名の取得 (例: “sample_report”)
WScript.Echo “・ベース名(拡張子無): ” & fso.GetBaseName(absolutePath)
‘ オブジェクトの解放(メモリのクリーンアップ)
Set fso = Nothing
End Sub
‘ メイン処理の実行
Call AnalyzeFilePath()
コードのここがポイント!
- `GetAbsolutePathName` の賢さ
このメソッドは、指定した文字列が「今どこで実行されているか(カレントディレクトリ)」を基準にして、完全な絶対パスを組み立ててくれます。スクリプトから相対位置にある設定ファイルやログフォルダを指し示すときに、これほど頼りになるものはありません。
- 存在しないパスでも動く安心感
「まだ作成されていない出力予定のファイルパス」に対しても、これらの解析メソッドはエラーを出さずに綺麗に分解してくれます。ファイルパスの文字列操作ロジックとして、純粋に優秀なのです。
—
4. 現場でありがちな「罠」と回避の知恵
ここで、実務でやりがちな「落とし穴」をいくつかシェアしておきます。ここを知っておくだけで、エラーに悩まされる時間を大幅に減らせますよ。
罠その1:カレントディレクトリの罠
`GetAbsolutePathName` は、「現在のスクリプトがどこにいるか」ではなく、「コマンドプロンプト等でどこから実行されたか(カレントディレクトリ)」を基準に相対パスを絶対パス化します。
タスクスケジューラやショートカット経由で実行された場合、意図しない場所が基準になってしまうことがあります。
- 対策: スクリプトファイル自身の場所を基準にしたい場合は、`WScript.ScriptFullName` や `WScript.CreateObject(“WScript.Shell”).CurrentDirectory` を組み合わせるか、FSOの `GetParentFolderName(WScript.ScriptFullName)` を使ってスクリプトの実行場所を明示的に取得・固定するようにしましょう。
罠その2:オブジェクトの解放忘れ
VBScriptでは、`CreateObject` で生成したオブジェクトは、スクリプト終了時に自動解放されるとはいえ、長大なループ処理や複雑なスクリプトの中では、使い終わったら `Set fso = Nothing` で明示的にメモリを解放する癖をつけるのがプロの作法です。
—
おわりに
今回は、FSOを用いたパスの正規化(`GetAbsolutePathName`)と解体(`GetParentFolderName` など)について解説しました。
文字列の切り貼りで苦労していたパス操作が、FSOのメソッドを使うことで、驚くほどシンプルで堅牢になったことにお気づきでしょうか。
業務自動化のスクリプトにおいて、「パスを制する者はファイル操作を制する」と言っても過言ではありません。
ここをクリアしたあなたなら、もうマクロの記録やその場しのぎのコードとはおさらばです。ぜひ、日々の業務のファイル処理ツールにこの知見を取り入れてみてくださいね。
それでは、快適なVBScriptライフを!
