2008/08/22(Fri)バッチファイルTips "%~dp0"

2008/08/22 13:20 Software::Windows
Windowsには、ちょっとした処理をやらせるのに便利なバッチファイルというのがあるが、VistaからのUAC(ユーザーアカウント制御)で困っていた点があった。

というのが、VistaでUACがONの場合にシステムフォルダのような昇格が必要なフォルダへの書き込みを行った場合、
  • 昇格しないとカレントディレクトリは実行位置だが、書き込めない
  • 昇格すると、カレントディレクトリが強制的にC:\Windows\System32になる
という点である。

カレントディレクトリが分からないとなぜ困るかというと、カレントディレクトリにあるファイルを特定のフォルダへコピーさせるのが厄介だからである。

で、色々探してたら、いいコマンドがあった。
cd /d %~dp0
詳細部を説明していくと
cd
Change Directoryコマンド
/d
現在のドライブ名も一緒に変更する(これが無いとドライブを跨いだcdが不可能)
%0
%1, %2, %3...で第1, 2, 3,...引数を取得できるように、%0で実行パスが取得できる
~dp
dでカレントドライブ、pでカレントディレクトリ、~で""を削るという指定。~が無かった場合、中途半端に"が残ったりするので。*1


というわけで、バッチファイルの先頭には
@echo off
cd /d %~dp0

からはじめる癖をつけようか…。

参考元:な○の 屋: Vista エピソード その1

*1 : %1で受け取ったディレクトリにa.txtを作りたい場合、%1a.txtとすると、"C:\abc\"a.txtという風になる可能性がある。これを防ぐため、%~1a.txtとすれば、C:\abc\a.txtとなる。