您的位置:首页 > 其它

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\

从上面的结果可以看出:

  1. 执行
    d.bat
    时,当前工作目录为
    d.bat
    所在目录;
  2. 执行
    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