%cd% と %~dp0 はどちらも Windows でのバッチ処理で現在のディレクトリを表すために使用できますが、それらの機能は使用シナリオによって異なります。次の記事では、DOS バッチ処理における %cd% と %~dp0 の違いについて詳しく説明します。必要な方は参照してください。
問題の説明
バッチ処理 a.bat でバッチ処理 b.bat
を呼び出して実行したいとします。b.bat
は を知る必要があります。 >b .bat
の現在の場所を確認し、次のように run.exe
を実行します: 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%
代表的是当前工作目录(current working directory,variable);
%~dp0
代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。
我们来看看下面的例子:
// 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\
从上面的结果可以看出:
执行d.bat
时,当前工作目录为d.bat
所在目录;
执行c.bat
时,当前工作目录为c.bat
所在目录,即使在调用d.bat
后,该工作目录依旧是c.bat
所在目录。
问题解决
让我们再来看看问题描述中提及的问题——能不能成功执行run.exe
呢?
答案是:不能。“ %cd%run.exe
”表示的是“ C:run.exe
”,并非“ C:programrun.exe
”。那么如何更改呢?
有两种方案:
// 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"
问题延伸
上面的解决方案中plan 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%
代表的是当前工作目录(current working directory,variable);
%~dp0
代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。
从目前我们的使用情况来看,尽量使用%~dp0
,不建议使用%cd%
%cd%
と %~dp0
はどちらも現在のディレクトリを表すために使用できますが、それらの機能は使用シナリオによって異なります。同じ: 🎜%cd%
は現在の作業ディレクトリ (変数) を表します。 🎜 %~dp0
は、現在のバッチ ファイルが配置されている完全なディレクトリを表します (バッチ ファイルのディレクトリ、固定)。 🎜🎜🎜rrreee🎜🎜🎜 d.bat
を直接実行すると、結果は次のようになります。 🎜🎜rrreee🎜🎜🎜 c.bat
を直接実行すると、結果は次のようになります 🎜
🎜rrreee🎜🎜🎜 からわかるように、上記の結果: 🎜
d.bat
を実行すると、現在の作業ディレクトリは d.bat
が保存されているディレクトリになります。 code> が配置されています。 🎜c.bat
を実行すると、実行後も現在の作業ディレクトリは c.bat
が配置されているディレクトリになります。 d.bat
を呼び出しても、作業ディレクトリは c.bat
が配置されているディレクトリのままです。 🎜run.exe
は正常に実行できますか? 🎜🎜答えは「いいえ」です。 「%cd%run.exe
」は「C:programrun.exe
」ではなく「C:run.exe
」を意味します。では、どうやって変更すればよいのでしょうか? 🎜🎜解決策は 2 つあります: 🎜🎜rrreee🎜🎜🎜🎜問題の拡張🎜🎜🎜🎜 上記の解決策では、プラン A は現在のディレクトリを変更することで問題を解決しますが、その他の解決策もあります。その他の解決策はこちら 質問です。次の例を見てみましょう: 🎜
🎜rrreee🎜🎜🎜今、e.bat
と f.bat
は次のようになります。同じディスク上にありません。cd を直接使用して現在の作業ディレクトリを e.bat
から f.bat
に切り替えることはできません。 🎜
🎜 rrreee🎜🎜🎜ここは見落としやすい場所ですので、間違えないように注意してください。 🎜🎜🎜問題の概要🎜🎜🎜🎜%~dp0
と %cd%
、 %cd%
と %~dp0 はどちらも現在のディレクトリを表すために使用できますが、その機能は使用シナリオによって異なります: 🎜
% cd%
は現在の作業ディレクトリ (変数) を表します。 🎜%~dp0
は、現在のバッチ ファイルが配置されている完全なディレクトリ (バッチ ファイルのディレクトリ) を表します。 、 修理済み)。 🎜%~dp0
を使用するようにしてください。そうでない限り、%cd%
を使用することはお勧めできません。その他のニーズもございます。 🎜🎜DOS バッチ処理における %cd% と %~dp0 の違いの詳細な説明については、PHP 中国語 Web サイトに注目してください。 🎜