他の人の作ったバッチファイル等を見ていると、バッチファイルの先頭に「cd /d %~dp0」や「cd %~dp0」といったコマンドが書かれていることがあります。
本記事では、このコマンドの意味について説明します。
「cd /d %~dp0」の意味
まず、cdコマンドは作業フォルダの移動を行うコマンドです。
/dはcdコマンドのオプションなのですが、他のドライブにも移動できるようにするオプションだと思っていただければ問題ないです。要するに、今自分がCドライブにいるときに、DドライブやEドライブに移動できるようにするオプションです。移動自体はドライブを跨がなくてもいいのですが、とにかく付けておけばドライブが変わる移動にも対応できます。
最後に「%~dp0」は、現在自分がいるフォルダ(カレントディレクトリ)のパスを取得します。
すなわち、cdコマンドの/dオプションで、現在自分がいるフォルダ(カレントディレクトリ、例え違うドライブであっても)へ移動する動作を実現するコマンドになります。
何故このコマンドが必要か?
ここまで読まれた方は、このコマンドが何故必要なのかを疑問に思ったかもしれません。
というのも、例えば以下のようにDドライブ直下の「bat」フォルダに「test.bat」というバッチを作って、ダブルクリックで実行したとします。
このバッチの中身は「pauseコマンド」という、バッチの中でクリック待ちを発生させるコマンドのみを記述しています。
pause
このとき、このバッチのカレントディレクトリは
Dドライブ直下の「bat」フォルダです。すなわち「cd /d %~dp0」なんて使わなくても、既にバッチを実行したカレントディレクトリにいるわけなので、このコマンドがあってもなくても結果は変わりません。
cd /d %~dp0
pause
試しに実行してみましたが、「cd /d %~dp0」があってもなくてもDドライブ直下の「bat」フォルダにいることは変わりません。
このコマンドが何故必要かについてですが、実はバッチファイルは管理者権限で実行すると「C:\WINDOWS\system32」をカレントディレクトリとして実行されるという仕様があります。すなわち、実行場所≠カレントディレクトリになることがあり得るのです。
何が問題かと言いますと、Dドライブ直下「bat」フォルダでバッチを実行して、バッチファイルに何かカレントディレクトリにファイル出力するような処理が書かれていたとします。
このときにカレントディレクトリが「C:\WINDOWS\system32」になっていると、ここにファイルが出力されてしまうわけです。この仕様を知らない人からすると、バッチファイルを実行したフォルダにデータが出力されると思ったのに、実際には「C:\WINDOWS\system32」に出力されていて見つからないということになり得ます。
そこで必要となるのが、「cd /d %~dp0」です。
このコマンドを書いておくことで、バッチファイルを叩いたフォルダをカレントディレクトリにすることができるわけです。
実際にバッチファイルを配布して、さまざまなユーザが使うことを考えると、中には管理者権限で実行する人もいるかもしれませんね。そのようなケースでトラブルを招かないためにも、「cd /d %~dp0」を呪文のように書いておいた方がいいかもしれませんね。