bat檔案獲取當前目錄

2021-08-25 11:31:15 字數 2983 閱讀 9775

**

(win10)上**:

cd /d %~dp0

切換到當前bat檔案所在目錄

原文:知道windows的bat指令碼很強大,但是具體命令向來很少接觸,今天在win7上執行自己以前寫的乙個安裝mysql資料庫到系統服務的指令碼時,遇到一些問題,下面記錄一下。

問題:mysql服務安裝指令碼在win7下執行失敗

原因:win7下,以右鍵的「以管理員身份執行」預設進入的目錄是c:\windows\system32目錄,因此後續的cd demo_v2.0.4.9命令肯定進入不到正確的目錄

解決辦法:使用cd /d %~dp0

首先,指令碼如下,對具體startdemo.bat命令不多做解釋

cd demo_v2.0.4.9

cd mysql

@echo off

set mysql_home=%cd%

net stop "demomysql"

call "%mysql_home%\bin\mysqld.exe" remove  demomysql

call "%mysql_home%\bin\mysqld.exe" install demomysql --defaults-file="%mysql_home%\bin\my.ini"

net start "demomysql"

cd..

cd..

這個指令碼在xp、2000、2003等系統中都可以正常雙擊執行。在win7系統中雙擊執行時,會以普通使用者身份執行,此時所獲取的檔案路徑的確是當前路徑,而不是c:\windows\system32。但是執行到解除安裝以及安裝demomysql的系統服務時,普通使用者顯然許可權是不夠的。

於是在startdemo.bat右鍵選擇「以管理員身份執行」,此時又會出問題,win7可能出於安全問題考慮,此時獲得的目錄是c:\windows\system32,於是後面的執行都會出錯或者無效。

此時在指令碼開始嘗試加入命令cd %cd%,來獲取當前路徑,實驗得知,這行語句在xp等系統中有效,但是在win7中依然無效。得到的目錄依然是c:\windows\system32。

上網查了一下才知道要使用cd /d %~dp0命令來獲取指令碼所在的目錄。在指令碼最開始新增cd /d %~dp0即可。之後在xp系統上執行此指令碼,確認也沒有問題。下面對命令中涉及到的引數做一解釋。

關於cd 的/d引數,在cmd中敲入cd /?

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

使用 /d 命令列開關,除了改變驅動器的當前目錄之外,

還可改變當前驅動器。

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

c:\documents and settings\administrator>

如果我們執行如下命令,發現目錄依然還是在c:\documents and settings\administrator

c:\documents and settings\administrator>cd d:\tomcat6.0.18

c:\documents and settings\administrator>

此時,我們鍵入d:,不但會切換到d盤,而且會切換到d:/tomcat6.0.18的目錄

c:\documents and settings\administrator>cd d:\tomcat6.0.18

c:\documents and settings\administrator>d:

d:\tomcat6.0.18>

下面語句我們就能看到/d引數的作用了。發現加了/d引數之後直接切換到d盤的tomcat6.0.18目錄了。

c:\documents and settings\administrator>cd /d d:\tomcat6.0.18

d:\tomcat6.0.18>

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

對此命令並不清楚,以下內容都來自網際網路:

%~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 就是進入批處理所在目錄了

獲取當前目錄

tchar exefullpath max path getmodulefilename getmodulehandle null exefullpath,max path tcsrchr exefullpath,t 1 0 這是一段獲得程式當前目錄的一段 這段 很簡單,唯一有點難度的就是最後一句 ...

Bat建立用到的資料夾,Bat中獲取當前路徑

自己用到的 echo off rem echo 當前路徑 dp0 rem echo 當前路徑短檔名格式 sdp0 md dll md controls md class md formdialog md global md icons md reprots bat中獲取當前路徑 echo off s...

獲取 sh 檔案當前所在目錄

cd dirname 0 echo basename 0 is in pwd cd 說明 0當前shell程式的檔名 dirname 0,獲取當前shell程式的路徑 cd dirname 0 進入當前shell程式的目錄 dirname 從檔名剝離非目錄的字尾,列印去除了 後面部分的name 如果...