1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

DOSのバッチ構文における%~dp0などの拡張変数について解説します。

2022-02-10 14:35:46

時々、%~dp0 を使っている人を見かけます。

~ は拡張子で、相対パスを絶対パスに変換するのと同等です
0は、バッチファイルそのものを表します。
1 はバッチファイルのコマンドラインで受け取った最初の引数、%2 は 2 番目の引数を表し、以下同様です。
%~d0 はバッチプロセスがあるドライブ文字で、d はドライブを表します。
%~p0 は、バッチプロセスがあるディレクトリで、p はパスを表します。
%~dp0 はバッチプロセスがあるディスク文字とパスです

cd %~dp0 はバッチ・プロセスがあるディレクトリです。

詳しい説明は、コマンドコール /?

DOSのバッチ処理で%~dp0はどういう意味ですか?

(注:%0はバッチファイルのファイル名です。)

この文の意味は
カレントディレクトリをバッチ本体のディレクトリに変更する
ちょっと目が回ったでしょ?慌てずに、例を挙げてみましょう。
E:/jb51フォルダーにa.batというバッチがあるとします。
a.batの中身は
cd /d %~dp0
ここで
cd /d %~dp0 は cd /d e:/jb51 を意味します。
0 はバッチそのものを表します e:/jb51/a.bat
~dpは変数展開
dはパーティション番号eへの両展開。
p はパス /jb51 への展開です。
dpはパーティション番号のパスe:/jb51に展開されます。

以下は図です。

変数の構文の詳細を拡張しました。
:: オプションの構文 :
:: ~I - クォート(")を削除し、%I を展開します。
:: %~fI - %I を完全修飾パス名に展開します。
:: %~dI - %I をドライブ文字だけに展開します。
:: %~pI - %I をパスだけに展開します。
:: %~nI - %I をファイル名のみに展開します。
:: %~xI - %I をファイル拡張子のみに展開します。
:: %~sI - 短い名前だけでパスを展開します。
:: %~aI - %I をファイルの属性に展開します。
:: %~tI - %I をファイルの日付/時刻に展開します。
:: %~zI - %I をファイルのサイズに展開します。
:: %~$PATH:I - 環境変数 path にリストされているディレクトリを検索し、%I を展開します。
:: を最初に見つかった完全修飾名に変更します。もし、環境変数名
:: が定義されていないか、ファイルが見つからない場合、このキーの組み合わせは次のように展開されます。
:: 空文字列
:: 修飾語を組み合わせて、複数の結果を得ることができます。
:: %~dpI - %I をドライブ番号とパスだけに展開します。
:: %~nxI - %I をファイル名と拡張子のみに展開します。
:: %~fsI - %I をフルパス名と短い名前だけに展開します。
:: %~dp$PATH:i - 環境変数 path にリストされているディレクトリを検索し、%I を展開します。
:: で、最初に見つかったドライブ番号とパスを指定します。
:: %~ftzaI - %I を DIR と同様の出力行に展開します。

以下はパース例です。

インストール.batファイルがD:³³にある場合。
このファイルは次のように読みます。

@echo off
echo [INFO] This is a demo.
echo [INFO] %~dp0
pause

install.batを実行すると、コマンドラインの出力は次のようになります。

[INFO] This is a demo.
[INFO] D:\jeesite\bin\

名付けて。
文書そのものを表す %0

dはドライブレターを表します
p はパス
拡張オプションもあります。

%~f0 - フルパス + ファイル名

[INFO] D:\jeesite\bin\install.bat
%~n0

- ファイル名(拡張子なし)

[INFO] インストール
%~x0 - ファイル拡張子

[INFO] .bat

%~s0 - 短い名前だけを含むパスを展開します ("s" は Short, 短い)。
%~a0 - %0 をファイルのファイル属性に展開します ("a" は属性、つまりアトリビュートです)。
%~t0 - %0 をファイルの日付/時刻に展開します ("t "時刻)。
%~z0 - %0 をファイルのサイズに展開します (サイズ サイズ)

その他