在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
    這個腳本在xp、2000、2003等系統中都可以正常雙擊運行。在win7/Win10系統中雙擊運行時,會以普通用戶身份運行,此時所獲取的文件路徑的確是當前路徑,而不是C:\Windows\System32。但是運行到安裝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參數的解釋如下:

使用 /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      是盤符加路徑
cd %~dp0 就是進入批處理所在目錄了
————————————————
版權聲明:本文爲CSDN博主「小宇飛刀」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xieyunc/article/details/80471107

發佈了4 篇原創文章 · 獲贊 167 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章