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

博客原文鏈接

歡迎來我的博客: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%骤素,有其他需求除外匙睹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市济竹,隨后出現(xiàn)的幾起案子痕檬,更是在濱河造成了極大的恐慌,老刑警劉巖送浊,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦谜,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唁桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門闭树,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荒澡,你說我怎么就攤上這事报辱。” “怎么了单山?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵碍现,是天一觀的道長。 經(jīng)常有香客問我米奸,道長昼接,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任悴晰,我火速辦了婚禮慢睡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铡溪。我一直安慰自己漂辐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布佃却。 她就那樣靜靜地躺著者吁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饲帅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天瘤泪,我揣著相機(jī)與錄音灶泵,去河邊找鬼。 笑死对途,一個(gè)胖子當(dāng)著我的面吹牛赦邻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播实檀,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼惶洲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膳犹?” 一聲冷哼從身側(cè)響起恬吕,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎须床,沒想到半個(gè)月后铐料,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年钠惩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柒凉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篓跛,死狀恐怖膝捞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧沟,我是刑警寧澤蔬咬,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站央渣,受9級特大地震影響计盒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芽丹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一北启、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拔第,春花似錦咕村、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泳猬,卻和暖如春批钠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背得封。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工埋心, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忙上。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓拷呆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疫粥。 傳聞我的和親對象是個(gè)殘疾皇子茬斧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

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