【入門編】【スクリプト自身パス確定】WScript.ScriptFullName と InStrRev を用いたカレントディレクトリ依存脱却ロジック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは。業務自動化の世界へようこそ。

VBScriptで「カレントディレクトリ」に頼ったファイル操作をしていて、痛い目を見たことはありませんか?
「テスト環境では動いたのに、タスクスケジューラや別のバッチから呼び出すと『ファイルが見つかりません』と怒られる……」

これは自動化エンジニアが必ず通る洗礼です。なぜなら、スクリプトにとっての「カレントディレクトリ(作業フォルダ)」は、スクリプト自身の場所ではなく、「誰が・どこから呼び出したか」によって刻々と変化する気まぐれな存在だからです。

今日は、この「ディレクトリ依存の呪縛」から永遠に解放されるための、伝説的かつ唯一無二の定石を伝授しましょう。

なぜ「カレントディレクトリ」は信用してはいけないのか?

VBScriptにおいて `CreateObject(“Scripting.FileSystemObject”)` を使い、相対パスでファイルを開こうとすると、システムは「スクリプトがある場所」ではなく「実行したプロセスの現在位置」を見に行きます。

  • 直接ダブルクリック: スクリプトの場所がカレントになることが多い。
  • タスクスケジューラ: `C:\Windows\System32` がカレントになることが多い。
  • 別の場所からの呼び出し: 呼び出し元のパスがカレントになる。

これでは、スクリプトを配布するたびに設定ファイルが読み込めず、運用は破綻します。

解決策:スクリプトの居場所を「絶対的」に特定する

解決策はシンプルです。「自分自身がどこにいるか」を `WScript` オブジェクトから取得し、そこからパスを切り出すこと。 これがプロの流儀です。

核心となるロジック

以下のコードを見てください。ここには無駄な行は一行もありません。

‘ FSO(FileSystemObject)を生成
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. WScript.ScriptFullName で自分のフルパスを取得
Dim myFullPath
myFullPath = WScript.ScriptFullName

‘ 2. パスから「ファイル名」を除去して「フォルダパス」を抽出する
‘ InStrRevは「右側から」文字を探す関数。最後の「\」の位置を特定します
Dim myFolderPath
myFolderPath = Left(myFullPath, InStrRev(myFullPath, “\”) – 1)

‘ これで myFolderPath には、スクリプトが存在する階層が確実に入ります
‘ 例: D:\Projects\Automation\Script.vbs → D:\Projects\Automation

‘ 動作確認:メッセージボックスで表示
WScript.Echo “このスクリプトはここにいます: ” & myFolderPath

‘ 実践:同じフォルダ内にある設定ファイルを開く例
Dim configPath
configPath = fso.BuildPath(myFolderPath, “settings.ini”)
WScript.Echo “設定ファイルの場所: ” & configPath

コードの深掘り:なぜこの書き方なのか?

1. `WScript.ScriptFullName` の優位性

`WScript` は、実行環境そのものを指すオブジェクトです。`ScriptFullName` を使えば、OSが管理している「このファイルが今どこにあるか」という絶対的な真実を常に取得できます。これは環境の変化に一切左右されません。

2. `InStrRev` で「最後の境界線」を狙い撃つ

パスの中からディレクトリ部分だけを抜き出すとき、`InStr`(左から検索)ではなく `InStrRev`(右から検索)を使うのがポイントです。
ファイルパスにはフォルダ名の中に「\」が複数含まれる可能性がありますが、一番右側の「\」こそが、ディレクトリとファイル名の境界線であるという事実は変わりません。このロジックは非常に堅牢です。

3. `fso.BuildPath` を使う理由

パスを繋げる際に `myFolderPath & “\” & “filename”` と手動で書くのは危険です。区切り文字の重複や欠落を招く可能性があります。`fso.BuildPath` を使えば、OSが最適と判断する形でパスを結合してくれます。

初学者が陥りやすい「罠」

  • パスの末尾の「\」: `Left` 関数で抽出した結果には、末尾に「\」は含まれません。もし「\」付きでパスを保持したい場合は、ロジックを微調整するか、常に `BuildPath` を経由する習慣をつけてください。
  • 日本語パスへの対応: VBScriptはUnicodeをサポートしているため、基本的には日本語フォルダ名でも問題なく動作します。エンコーディングの問題で悩む前に、まずはこのパス解決を完璧にしてください。

最後に:プロのエンジニアへの第一歩

このコードをテンプレートとして保存し、すべてのスクリプトの冒頭に配置してください。
これさえ理解していれば、あなたはもう「カレントディレクトリがどこか分からない」という悩みから解放されます。

VBScriptは古い言語と言われますが、「実行環境の特性を理解し、堅牢なロジックを組む」という点において、これほど教訓的な言語はありません。

ここをクリアしたあなたは、もう初心者ではありません。次は、このスクリプトを使って、より複雑な外部アプリケーションの自動化に挑戦してみましょう。応援していますよ。

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