DOS批处理中%cd%与%~dp0的区别详解
问题描述
假设我们要在批处理a.bat里调用执行批处理b.bat,b.bat需要知道b.bat的当前位置,并执行run.exe,如下:
//directorystructure //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%代表的是当前工作目录(currentworkingdirectory,variable);
- %~dp0代表的是当前批处理文件所在完整目录(thebatchfile'sdirectory,fixed)。
我们来看看下面的例子:
//directorystructure //c: //-c.bat //-program //-d.bat //c.bat call"%cd%\program\d.bat" //d.bat @echooff echocd=%cd% echodp0=%~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”。那么如何更改呢?
有两种方案:
//planA //changethecurrentworkingdirectory //a.bat cd"%~dp0" call"%cd%\program\b.bat" //b.bat cd"%~dp0" "%cd%\run.exe" //planB //using%~dp0directly //a.bat call"%~dp0program\b.bat" //b.bat "%~dp0run.exe"
问题延伸
上面的解决方案中planA通过更改当前目录来解决该问题,可以这里面也存在另外一个问题,让我们看下面的例子:
//directorystructure //c: //-program //-f.bat //d: //-e.bat //planA //changethecurrentworkingdirectory //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%代表的是当前工作目录(currentworkingdirectory,variable);
- %~dp0代表的是当前批处理文件所在完整目录(thebatchfile'sdirectory,fixed)。
从目前我们的使用情况来看,尽量使用%~dp0,不建议使用%cd%,有其他需求除外。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。