1. 程式人生 > >以管理員身份執行bat指令碼時,獲取當前檔案所在目錄

以管理員身份執行bat指令碼時,獲取當前檔案所在目錄

以管理員身份執行bat指令碼時,獲取當前檔案所在目錄

    知道windows的bat指令碼很強大,但是具體命令向來很少接觸,今天在win7上執行自己以前寫的一個安裝mysql資料庫到系統服務的指令碼時,遇到一些問題,下面記錄一下。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

問題: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引數

關於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的批處理命令的詳細解釋

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

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