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

DOSのバッチ処理における%cd%と%~dp0の違いについて説明します。

2022-02-10 14:24:50

問題の説明

バッチa.batでバッチの実行を呼び出すとすると b.bat は、その b.bat 知る必要がある b.bat を現在の場所で実行し run.exe を以下のように設定します。

// directory structure
// c:
// -a.bat
// -program
// -b.bat
// -run.exe
// a.bat
call "%cd%\program\b.bat"
// b.bat
"%cd%\run.exe"

さて、これでうまく実行できるでしょうか? run.exe ?

問題分析

%cd% %~dp0 はどちらもカレントディレクトリを表すのに使えますが、異なる使用シナリオで異なる機能を果たします。

  • %cd% は現在の作業ディレクトリを表します(変数)。
  • %~dp0 は、バッチファイルのディレクトリがあるフルディレクトリを表します(固定)。

次の例を見てみましょう。

// directory structure
// c:
// -c.bat
// -program
// -d.bat
// c.bat
call "%cd%\program\d.bat"
// d.bat
@echo off
echo cd = %cd%
echo dp0 = %~dp0

直接実行する d.bat となり、その結果は

cd = C:\program
dp0 = C:\program\

直接実行する c.bat となり、その結果は

cd = C:\
dp0 = C:\program\

上の結果からわかるように

  1. の実行 d.bat 現在の作業ディレクトリが d.bat ディレクトリを作成します。
  2. 実行する c.bat 現在の作業ディレクトリが c.bat を呼び出しても d.bat を指定すると、作業ディレクトリは c.bat ディレクトリを作成します。

問題解決

問題の説明で述べた問題に戻りましょう - うまく実行できるかどうか run.exe ?

答えは、「できない」です "。 %cd%\run.exe は "で示されます。 C:\run.exe はなく、"です。 C:\program\run.exe "です。では、どうすれば変更できるのでしょうか?

2つの選択肢があります。

// plan A
// change the current working directory
// a.bat
cd "%~dp0"
call "%cd%\program\b.bat"
// b.bat
cd "%~dp0"
"%cd%\run.exe"
// plan B
// using %~dp0 directly
// a.bat
call "%~dp0program\b.bat"
// b.bat
"%~dp0run.exe"

質問の拡張子

上記の解決策では、A案はカレントディレクトリを変更することで問題を解決していますが、ここにも問題があるので、次の例を見てみましょう。

// directory structure
// c:
// -program
// -f.bat
// d:
// -e.bat
// plan A
// change the current working directory
// e.bat
cd "%~dp0"
call "c:\program\f.bat"
// f.bat
cd "%~dp0"
"%cd%\run.exe"

現在 e.bat f.bat が同じドライブにない場合は e.bat 現在の作業ディレクトリを切り替えて f.bat cdを直接使ってもうまくいかないので、:

cd /d "%~dp0"

ここは見落としがちなところなので、間違えないように覚えておきましょう。

問題の概要

再掲載 %~dp0 %cd% の違いは %cd% %~dp0 はどちらもカレントディレクトリを表すのに使えますが、異なる使用シナリオで異なる機能を果たします。

  • %cd% は現在の作業ディレクトリを表します(変数)。
  • %~dp0 は、バッチファイルのディレクトリを表します(固定)。

現在の使い方からすると %~dp0 を使用することはお勧めしません。 %cd% 特に必要な場合を除き

概要

この記事の内容が、あなたの勉強や仕事に役立てば幸いです。また、何か質問があれば、コメントを残してください。