问题描述
假设我们要在批处理a.bat里调用执行批处理b.bat
,b.bat
需要知道b.bat
的当前位置,并执行run.exe
,如下:
// directory structure// c:// -a.bat// -program// -b.bat// -run.exe// a.batcall "%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.batcall "%cd%/program/d.bat"// d.bat@echo offecho cd = %cd%echo dp0 = %~dp0 |
直接运行d.bat
,结果为
cd = C:/programdp0 = 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.batcd "%~dp0"call "%cd%/program/b.bat"// b.batcd "%~dp0""%cd%/run.exe"// plan B// using %~dp0 directly// a.batcall "%~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.batcd "%~dp0"call "c:/program/f.bat"// f.batcd "%~dp0""%cd%/run.exe" |
现在e.bat
和f.bat
不在同一个盘符了,从e.bat
切换当前工作目录到f.bat
直接使用cd是不行的,必须要使用:
cd /d "%~dp0" |
这个地方容易疏忽,切记不要犯错。
问题总结
我们来重申下%~dp0
和%cd%
的区别, %cd%
和
新闻热点
疑难解答