好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

DOS批处理中%cd%与%~dp0的区别详解

Windows下批处理中%cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同。下面这篇文章就来给大家详细介绍了DOS批处理中%cd%与%~dp0的区别,需要的朋友可以参考借鉴。

问题描述

假设我们要在批处理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% 代表的是当前工作目录(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:\program\run.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% ,有其他需求除外。

更多DOS批处理中%cd%与%~dp0的区别详解相关文章请关注PHP中文网!

查看更多关于DOS批处理中%cd%与%~dp0的区别详解的详细内容...

  阅读:56次