バッチファイルのパス取得で悩んだ

バッチファイル自身のパス取得についてです。バッチファイルを作成していて、「%~dp0」でパスを取得できないケースに気づいたので、メモしておきます。

はじめに

バッチファイルの中で「%~dp0」とすると、そのバッチファイル自身のパスを取得することができます。*1 しかし、「%~dp0」ではパスを取得できないケースがあることに気づきました。どうやら、以下の条件を両方満たす場合に、うまく取得できないようです。

  • 環境変数PATHを使って、バッチファイルを呼び出す。
  • バッチファイル名を二重引用符で囲む。

テスト用バッチファイルと実行結果

テスト環境は、Windows XP SP3です。

C:\program files\bin\bat_path_test.cmd (環境変数PATHに「C:\program files\bin」を追加しておく。)

@echo off
echo [%%0]    %0
echo [%%~0]   %~0
echo [%%~dp0] %~dp0

C:\workにて実行

C:\work>cd
C:\work

C:\work>bat_path_test.cmd
[%0]    bat_path_test.cmd
[%~0]   bat_path_test.cmd
[%~dp0] C:\Program Files\bin\

C:\work>"bat_path_test.cmd"
[%0]    "bat_path_test.cmd"
[%~0]   bat_path_test.cmd
[%~dp0] C:\work\

1回目の呼び出し(引用符なし)では、バッチファイルのある「C:\Program Files\bin\」を正しく取得できています。しかし、2回目の呼び出し(引用符あり)では、なぜかカレントディレクトリである「C:\work\」が返ってきました。

なぜこんな動作なのかはわかりません。今回のところは、バッチファイル名を二重引用符で囲まないことで問題を回避しました。

*1:「call /?」参照