「 %~dp0 」は何をしているのか

メモ:

最近、バッチファイルを作ったことがない人やコマンドを叩いたことがない人をちらほら見かけるようになりました。

作成したバッチファイルの中に「 %~dp0 」みたいな記述があるのですが、「%」とか「~」沢山あって、何?ってなるようなので、ここにまとめておきます。

「 %~dp0 」の意味は?

バッチファイルの中でよく見かける「 %~dp0 」の記述に次のようなものがあります。

@echo OFF

cd /d %~dp0

「 cd 」コマンドは、ディレクトリの変更で、引数の一つ目にある「 /d 」はドライブを変更したい時に指定します。その次に「どこに変更したいのか」の部分が「 %~dp0 」になります。

それでは、「 %~dp0 」の部分が何を行っているのか見ていきたいと思います。

Window のバッチでは、「 %0 」や「 %1 」などの「%数字」は、引数を表し「 0 」は例外で実行しているバッチファイル自身になります。それ以降の「 %1 」や「 %2 」は、バッチに渡される第一引数、第二引数となります。

例えば、「hoge.bat」というバッチファイルがあり、「hoge.bat aaa bbb」のような引数を指定したとします。すると、「 %0 」「 %1 」「 %2 」には次のように値が対応します。

「%0」 -> D:\work\hoge.bat 
「%1」 -> aaa 
「%2」 -> bbb

「 % 」と「 0 」の間にある「~dp」は?

「 ~dp 」のように「 % 」と「数字」の間にある「~」や「d」は、「%数字」の内容をどのように加工(展開)して取り出すかを指定しています。

例えば、「Program Files」のようなスペースを含んだパスの場合、「”C:\Program Files\Git”」のようにダブルクォーテーションで括ったりします。「 ~ 」を指定すると、パスから「 “ 」を取り除く指定になり純粋なパス文字列になります。

また、「d」はドライブ文字列を抽出し、「p」は、ドライブ文字列以外のパスを抽出します。これらを組み合わせて「 %~dp0 」 とするとファイル名を含むバッチファイルのフルパス(%0)からドライブとファイル名以外のパスが得られることになります。

この指定は、「 ~dp 」以外にもあるのでまとめておきます。

指定 概要
%~d0 %0をドライブ文字だけに展開
%~p0 %0をパス名だけに展開
%~n0 %0をファイル名だけに展開
%~x0 %0をファイル拡張子だけに展開
%~dp0 %0をドライブ文字とパスだけに展開
%~nx0 %0をファイル名と拡張子だけに展開
%~nxI0 %0をファイル名と拡張子だけに展開
%~fs0 %0を完全なパスと短い名前だけに展開