工作上還有不少批次作業靠 DOS Batch 檔跑排程,執行時常需確認工作目錄指向 .bat 檔所在目錄,指令檔中的相對路徑才會正確。

之前常用解法不外乎兩種,第一種是設定排程時指定 Start in 路徑:

額外設定要求增加人為出錯風險且只在排程執行時有效,手動下指令執行 .bat 的話不適用。因此,我們更常用的一種做法是在 .bat 一開始加上 CD 切換工作目錄:

D:
CD D:\Batch\TheJob
REM 開始作業...

把路徑寫死代表要預先知道部署目錄或部署完現場修改,而且任意更換資料夾 .bat 會壞掉(實務上異動機率不高就是了),雖知道有這些缺點,但前人寫後人抄,這招用了十幾年,倒也相安無事。

這陣子 PowerShell 寫多了,學會用 $PSScriptRoot 參數抓 .ps1 所在目錄推算路徑的招式,便想說 .bat 應該也對映做法。

查了一下,還真有!

CD /D "%~dp0"
REM 開始作業...

咒語般的 %~dp0 變數會代入 .bat 所在路徑,而 CD /D 的 /D 參數可連磁碟機一起切換,就不用像以前傻傻先 D: 再 CD D:\...。

晚了十年,但至少學到了,呵。

Tips of how to change the working folder to the batch file's folder.


Comments

Be the first to post a comment

Post a comment