批處理中%cd%與%~dp0的區(qū)別

博客原文鏈接

歡迎來(lái)我的博客:http://jerkwisdom.github.io/developing/system/dos-current-path/

問(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),為變量;
  • %~dp0代表的是當(dāng)前批處理文件所在完整目錄(the batch file's directory),為常量。

我們來(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è)盤符了,從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%,有其他需求除外。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 個(gè)人學(xué)習(xí)批處理的初衷來(lái)源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過(guò)程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,981評(píng)論 0 11
  • dos 批處理 一:windows的命令行模式(win+R)在里面寫CMD就可以進(jìn)入windows的命令行模式了二...
    chenchao981閱讀 840評(píng)論 0 6
  • 說(shuō)明本次redis集群安裝在rhel6.8 64位機(jī)器上,redis版本為3.2.8,redis的gem文件版本為...
    讀或?qū)?/span>閱讀 15,615評(píng)論 3 9
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評(píng)論 19 139
  • 170320 小組討論,寫的草稿讓大家還算滿意,稍微安心了許多。 很久沒(méi)去上語(yǔ)言課,還有一周就要結(jié)束了。再次去的時(shí)...
    XxXxXxN閱讀 182評(píng)論 0 0

友情鏈接更多精彩內(nèi)容