ホームページ  >  記事  >  バックエンド開発  >  DOSバッチ処理における%cd%と%~dp0の違いを詳しく解説

DOSバッチ処理における%cd%と%~dp0の違いを詳しく解説

高洛峰
高洛峰オリジナル
2017-02-14 13:33:502340ブラウズ

%cd% と %~dp0 はどちらも Windows でのバッチ処理で現在のディレクトリを表すために使用できますが、それらの機能は使用シナリオによって異なります。次の記事では、DOS バッチ処理における %cd% と %~dp0 の違いについて詳しく説明します。必要な方は参照してください。

問題の説明

バッチ処理 a.bat でバッチ処理 b.bat を呼び出して実行したいとします。b.bat を知る必要があります。 >b .bat の現在の場所を確認し、次のように run.exe を実行します: b.batb.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\

从上面的结果可以看出:

  1. 执行d.bat时,当前工作目录为d.bat所在目录;

  2. 执行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.batf.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%

rrreee

🎜これで、run はどうでしょうか? 🎜🎜🎜問題分析🎜🎜🎜🎜%cd%%~dp0 はどちらも現在のディレクトリを表すために使用できますが、それらの機能は使用シナリオによって異なります。同じ: 🎜
  • 🎜%cd% は現在の作業ディレクトリ (変数) を表します。 🎜
  • 🎜 %~dp0 は、現在のバッチ ファイルが配置されている完全なディレクトリを表します (バッチ ファイルのディレクトリ、固定)。 🎜🎜
🎜次の例を見てみましょう: 🎜

🎜rrreee🎜🎜🎜 d.bat を直接実行すると、結果は次のようになります。 🎜🎜rrreee🎜🎜🎜 c.bat を直接実行すると、結果は次のようになります 🎜

🎜rrreee🎜🎜🎜 からわかるように、上記の結果: 🎜

  1. 🎜 d.bat を実行すると、現在の作業ディレクトリは d.bat が保存されているディレクトリになります。 code> が配置されています。 🎜
  2. 🎜 c.bat を実行すると、実行後も現在の作業ディレクトリは c.bat が配置されているディレクトリになります。 d.bat を呼び出しても、作業ディレクトリは c.bat が配置されているディレクトリのままです。 🎜
🎜🎜問題解決🎜🎜🎜🎜問題の説明に記載されている問題を見てみましょう - run.exe は正常に実行できますか? 🎜🎜答えは「いいえ」です。 「%cd%run.exe」は「C:programrun.exe」ではなく「C:run.exe」を意味します。では、どうやって変更すればよいのでしょうか? 🎜🎜解決策は 2 つあります: 🎜

🎜rrreee🎜🎜🎜🎜問題の拡張🎜🎜🎜🎜 上記の解決策では、プラン A は現在のディレクトリを変更することで問題を解決しますが、その他の解決策もあります。その他の解決策はこちら 質問です。次の例を見てみましょう: 🎜

🎜rrreee🎜🎜🎜今、e.batf.bat は次のようになります。同じディスク上にありません。cd を直接使用して現在の作業ディレクトリを e.bat から f.bat に切り替えることはできません。 🎜

🎜 rrreee🎜🎜🎜ここは見落としやすい場所ですので、間違えないように注意してください。 🎜🎜🎜問題の概要🎜🎜🎜🎜%~dp0%cd% %cd% と %~dp0 はどちらも現在のディレクトリを表すために使用できますが、その機能は使用シナリオによって異なります: 🎜

  • 🎜 % cd% は現在の作業ディレクトリ (変数) を表します。 🎜
  • 🎜%~dp0 は、現在のバッチ ファイルが配置されている完全なディレクトリ (バッチ ファイルのディレクトリ) を表します。 、 修理済み)。 🎜
🎜 現在の使用状況から判断すると、%~dp0 を使用するようにしてください。そうでない限り、%cd% を使用することはお勧めできません。その他のニーズもございます。 🎜🎜DOS バッチ処理における %cd% と %~dp0 の違いの詳細な説明については、PHP 中国語 Web サイトに注目してください。 🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。