博客原文鏈接
歡迎來我的博客:http://jerkwisdom.github.io/developing/system/dos-current-path/
問題描述
假設(shè)我們要在批處理a.bat里調(diào)用執(zhí)行批處理b.bat舅世,b.bat需要知道b.bat的當(dāng)前位置,并執(zhí)行run.exe奇徒,如下:
// directory structure
// c:
// -a.bat
// -program
// -b.bat
// -run.exe
// a.bat
call "%cd%\program\b.bat"
// b.bat
"%cd%\run.exe"
那么現(xiàn)在能不能成功執(zhí)行run.exe呢雏亚?
問題分析
%cd%和%~dp0都能用來表示當(dāng)前目錄,但是他們在不同的使用場景下摩钙,功能卻不相同:
- %cd%代表的是當(dāng)前工作目錄(current working directory)罢低,為變量;
- %~dp0代表的是當(dāng)前批處理文件所在完整目錄(the batch file's directory)胖笛,為常量网持。
我們來看看下面的例子:
// 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
直接運(yùn)行d.bat宜肉,結(jié)果為
cd = C:\program
dp0 = C:\program\
直接運(yùn)行c.bat,結(jié)果為
cd = C:\
dp0 = C:\program\
從上面的結(jié)果可以看出:
- 執(zhí)行d.bat時(shí)翎碑,當(dāng)前工作目錄為d.bat所在目錄谬返;
- 執(zhí)行c.bat時(shí),當(dāng)前工作目錄為c.bat所在目錄日杈,即使在調(diào)用d.bat后遣铝,該工作目錄依舊是c.bat所在目錄。
問題解決
讓我們再來看看問題描述中提及的問題——能不能成功執(zhí)行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通過更改當(dāng)前目錄來解決該問題鹿鳖,可以這里面也存在另外一個(gè)問題扁眯,讓我們看下面的例子:
// 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"
現(xiàn)在e.bat和f.bat不在同一個(gè)盤符了,從e.bat切換當(dāng)前工作目錄到f.bat直接使用cd是不行的翅帜,必須要使用:
cd /d "%~dp0"
這個(gè)地方容易疏忽姻檀,切記不要犯錯(cuò)。
問題總結(jié)
我們來重申下%dp0和%cd%的區(qū)別涝滴,%cd%和%dp0都能用來表示當(dāng)前目錄绣版,但是他們在不同的使用場景下,功能卻不相同:
- %cd%代表的是當(dāng)前工作目錄(current working directory歼疮,variable)杂抽;
- %~dp0代表的是當(dāng)前批處理文件所在完整目錄(the batch file's directory,fixed)韩脏。
從目前我們的使用情況來看缩麸,盡量使用%~dp0,不建議使用%cd%骤素,有其他需求除外匙睹。