转载:https://www.jb51.net/article/105325.htm
DOS批处理中%cd%与%~dp0的区别详解
Windows下批处理中%cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同。下面这篇文章就来给大家详细介绍了DOS批处理中%cd%与%~dp0的区别,需要的朋友可以参考借鉴。
假设我们要在批处理a.bat里调用执行批处理b.bat
,b.bat
需要知道b.bat
的当前位置,并执行run.exe
,如下:
1
2
3
4
5
6
7
8
9
10
|
// directory structure // c: // -a .bat
// -program
// -b .bat
// -run .exe
// a.bat call "%cd%\program\b.bat"
// b.bat "%cd%\run.exe" |
// directory structure
// c:
// -a.bat
// -program
// -b.bat
// -run.exe
// a.bat
call "%cd%\program\b.bat"
// b.bat
"%cd%\run.exe"
// 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)。
我们来看看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
|
// 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
|
// 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
// 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
,结果为
1
2
|
cd = C:\program
dp0 = C:\program\ |
cd = C:\program
dp0 = C:\program\
dp0 = C:\program\
直接运行c.bat
,结果为
1
2
|
cd = C:\
dp0 = C:\program\ |
cd = C:\
dp0 = C:\program\
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
”。那么如何更改呢?
有两种方案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 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
// 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"
// 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通过更改当前目录来解决该问题,可以这里面也存在另外一个问题,让我们看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 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" |
// 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"
// 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是不行的,必须要使用:
1
|
cd /d "%~dp0"
|
cd /d "%~dp0"
这个地方容易疏忽,切记不要犯错。
问题总结
我们来重申下%~dp0
和%cd%
的区别, %cd%
和%~dp0
都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同:
-
%cd%
代表的是当前工作目录(current working directory,variable); -
%~dp0
代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。
从目前我们的使用情况来看,尽量使用%~dp0
,不建议使用%cd%
,有其他需求除外。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。