DOS批處理中%cd%與%~dp0的區(qū)別詳解
問(wèn)題描述
假設(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呢?
問(wèn)題分析
%cd%和%~dp0都能用來(lái)表示當(dāng)前目錄,但是他們?cè)诓煌氖褂脠?chǎng)景下,功能卻不相同:
%cd%代表的是當(dāng)前工作目錄(current working directory,variable);%~dp0代表的是當(dāng)前批處理文件所在完整目錄(the batch file's directory,fixed)。
我們來(lái)看看下面的例子:
// 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所在目錄。
問(wèn)題解決
讓我們?cè)賮?lái)看看問(wèn)題描述中提及的問(wèn)題——能不能成功執(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"
問(wèn)題延伸
上面的解決方案中plan A通過(guò)更改當(dāng)前目錄來(lái)解決該問(wèn)題,可以這里面也存在另外一個(gè)問(wèn)題,讓我們看下面的例子:
// 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è)盤(pán)符了,從e.bat切換當(dāng)前工作目錄到f.bat直接使用cd是不行的,必須要使用:
cd /d "%~dp0"
這個(gè)地方容易疏忽,切記不要犯錯(cuò)。
問(wèn)題總結(jié)
我們來(lái)重申下%~dp0和%cd%的區(qū)別, %cd%和%~dp0都能用來(lái)表示當(dāng)前目錄,但是他們?cè)诓煌氖褂脠?chǎng)景下,功能卻不相同:
%cd%代表的是當(dāng)前工作目錄(current working directory,variable);%~dp0代表的是當(dāng)前批處理文件所在完整目錄(the batch file's directory,fixed)。
從目前我們的使用情況來(lái)看,盡量使用%~dp0,不建議使用%cd%,有其他需求除外。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
用批處理記錄服務(wù)器遠(yuǎn)程終端3389登陸情況
利用自制的BAT格式腳本與LOG日志文件來(lái)記錄每次用戶(hù)登錄服務(wù)器的情況,可以有效獲得不同用戶(hù)的登錄時(shí)間與次數(shù)。2010-03-03
在網(wǎng)上找的創(chuàng)建《CMD命令速查手冊(cè)》的批處理
在網(wǎng)上找的創(chuàng)建《CMD命令速查手冊(cè)》的批處理,這個(gè)批處理可以生成CMD命令速查手冊(cè),喜歡的朋友可以參考下。2011-01-01
用批處理實(shí)現(xiàn)讀取文本文件并實(shí)現(xiàn)超鏈接代碼的輸出
今天用chm反編譯軟件實(shí)現(xiàn)了輸出所以文章類(lèi)別功能,可是沒(méi)有index索引頁(yè),還好都是中文文章名,我想讓這每行文本都是以超連接的形式顯示到頁(yè)面中,實(shí)現(xiàn)索引2008-06-06
批處理的圖形界面實(shí)現(xiàn)方法小結(jié)
其實(shí)所謂的圖形界面就是通過(guò)bat通過(guò)調(diào)用mshta來(lái)實(shí)現(xiàn)的一些對(duì)話框效果,這里特整理下, 方便需要的朋友2014-05-05
遠(yuǎn)程批量修改計(jì)算機(jī)IP設(shè)置的批處理
當(dāng)網(wǎng)絡(luò)整改需要大量IP修改的時(shí)候,可利用該腳本進(jìn)行更改(重啟計(jì)算機(jī)前不生效,可繼續(xù)工作),然后等下班時(shí)間修改交換機(jī)配置,次日所有計(jì)算機(jī)啟動(dòng)后就可以用新IP工作了2012-05-05
根據(jù)輸入的文字實(shí)現(xiàn)輸出倒文的批處理
根據(jù)輸入的文字實(shí)現(xiàn)輸出倒文的批處理...2007-08-08

