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

2019-01-29 21:22:10刘景俊

问题描述

假设我们要在批处理a.bat里调用执行批处理b.batb.bat需要知道b.bat的当前位置,并执行run.exe,如下:

// directory structure // c: // -a.bat // -program // -b.bat // -run.exe // a.bat call "%cd%programb.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%programd.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%programb.bat" // b.bat cd "%~dp0" "%cd%run.exe" // plan B // using %~dp0 directly // a.bat call "%~dp0programb.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:programf.bat" // f.bat cd "%~dp0" "%cd%run.exe"

现在e.batf.bat不在同一个盘符了,从e.bat切换当前工作目录到f.bat直接使用cd是不行的,必须要使用:

cd /d "%~dp0"

这个地方容易疏忽,切记不要犯错。

问题总结

我们来重申下%~dp0%cd%的区别, %cd%

相关文章 大家在看