天天看點

在cmd/bat腳本中擷取目前腳本檔案所在目錄

Q:在Win7/Win10中以管理者身份運作在cmd/bat腳本時,如何擷取目前腳本檔案所在目錄?

    當我們在Win7/Win10中使用滑鼠右鍵的“以管理者身份運作”以管理者身份運作cmd/bat腳本時,系統預設進入的目錄是C:\Windows\System32目錄,是以cmd腳本檔案中的相應指令因路徑不對提示找不到要執行的程式檔案等提示。

netpay_Service.exe -install
netpay_Monitor.exe -install      

A:解決辦法:使用cd /d %~dp0,先進入cmd/bat腳本所在的目錄,再去執行其他指令。

netpay_Service.exe -install
netpay_Monitor.exe -install      

netpay_Service.exe -install 的系統服務時,普通使用者顯然權限是不夠的。

    于是在InstllSvc_En.cmd右鍵選擇“以管理者身份運作”,此時又會出問題,win7/win10可能出于安全問題考慮,此時獲得的目錄是C:\Windows\System32,于是提示netpay_Service.exe指令無效或程式檔案不存在,執行出錯。

    此時在腳本開始嘗試加入指令cd %cd%,來擷取目前路徑,實驗得知,這行語句在xp等系統中有效,但是在win7/win10中依然無效。得到的目錄依然是C:\Windows\System32。

   百度一下才知道要使用cd /d %~dp0指令來擷取腳本所在的目錄。在腳本最開始添加cd /d %~dp0即可,如下:

cd /d %~dp0
netpay_Service.exe -install
netpay_Monitor.exe -install      

    在Windows XP~Windows 10系統上運作此腳本,确認都沒有問題。下面對指令中涉及到的參數做一解釋。

一、關于cd的/d參數

關于cd 的/d參數,在cmd中敲入cd /?

可以看到/d參數的解釋如下:

在cmd/bat腳本中擷取目前腳本檔案所在目錄

使用 /D 指令行開關,除了改變驅動器的目前目錄之外,還可改變目前驅動器。這句話不太好了解,我做個試驗:

通常我們在xp系統中打開cmd視窗時,會顯示

C:\users\Administrator>

如果我們執行“cd e:\xxx”指令,發現目錄依然還是在C:\users\Administrator

此時,我們鍵入e:,不但會切換到d盤,而且會會發現E盤上的目前目錄為e:/xxx。

C:\users\Administrator>cd e:\xxx

C:\users\Administrator>e:

e:\xxx>

下面語句我們就能看到/d參數的作用了。發現加了/d參數之後直接切換到e:\xxx目錄了。

C:\users\Administrator>cd /d e:\xxx

e:\xxx>

結論:不加/d參數隻能在同一驅動器的目錄之間切換,加上/d參數則能在不同驅動器之間的目錄之間切換。

二、關于%~dp0的批處理指令的詳細解釋

對此指令并不清楚,以下内容都來自百度搜尋結果:

%~dp0 “d”為Drive的縮寫,即為驅動器,磁盤、“p”為Path縮寫,即為路徑,目錄

cd是轉到這個目錄,不過我覺得cd /d %~dp0 還好些

選項文法:

~0 - 删除任何引号("),擴充 %0

%~f0 - 将 %0 擴充到一個完全合格的路徑名(“f”是file,即檔案)

%~d0 - 僅将 %0 擴充到一個驅動器号

%~p0 - 僅将 %0 擴充到一個路徑

%~n0 - 僅将 %0 擴充到一個檔案名(“n”是name 檔案名)

%~x0 - 僅将 %0 擴充到一個檔案擴充名

%~s0 - 擴充的路徑隻含有短名(“s”為Short,短的)

%~a0 - 将 %0 擴充到檔案的檔案屬性(“a”為attribute,即屬性)

%~t0 - 将 %0 擴充到檔案的日期/時間(“t”time)

%~z0 - 将 %0 擴充到檔案的大小(Size 大小)

%~$PATH:0 - 查找列在路徑環境變量的目錄,并将 %0 擴充到找到的第一個完全合格的名稱。如果環境變量名未被定義,或者沒有找到檔案,此組合鍵會擴充到空字元串,可以組合修飾符來得到多重結果:

%~dp0 - 僅将 %0 擴充到一個驅動器号和路徑

%~nx0 - 僅将 %0 擴充到一個檔案名和擴充名

%~fs0 - 僅将 %0 擴充到一個帶有短名的完整路徑名

%~dp$PATH:0 - 查找列在路徑環境變量的目錄,并将 %I 擴充到找到的第一個驅動器号和路徑。

%~ftza0 - 将 %0 擴充到類似輸出線路的 DIR

%0為目前批處理檔案,如果0換成1為第一個檔案,2為第2個

*********************************************************************************************

%0             代指批處理檔案自身

%~d0        是指批處理所在的盤符

%~dp0      是盤符加路徑