DOS批处理中%cd%与%~dp0的区别详解
2017-02-12 15:03
621 查看
问题描述
假设我们要在批处理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的区别[forward]
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的区别
- DOS批处理中%cd%和%~dp0的异同
- DOS批处理中%cd%和%~dp0的异同
- DOS批处理中%cd%和%~dp0的异同
- DOS批处理中%cd%和%~dp0的异同
- dos 批处理中%cd% 和%~dp0%的区别
- 【转载】DOS批处理中%cd%和%~dp0的异同
- DOS批处理中%cd%和%~dp0的异同分析