win7/10中以管理員身份運行bat腳本時,獲取當前文件所在目錄

https://blog.csdn.net/tsvico/article/details/78050884html

此命令適用於bat雙擊正常打開,以管理員打開閃退的狀況

如下爲轉載,地址http://blog.chinaunix.net/uid-27000874-id-3224772.htmlmysql

知道windows的bat腳本很強大,可是具體命令向來不多接觸,今天在win7上運行本身之前寫的一個安裝mysql數據庫到系統服務的腳本時,遇到一些問題,下面記錄一下。sql

 

問題:mysql服務安裝腳本在win7下運行失敗數據庫

 

緣由:win7下,以右鍵的「以管理員身份運行」默認進入的目錄是C:\Windows\System32目錄,所以後續的cd Demo_V2.0.4.9命令確定進入不到正確的目錄windows

 

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

首先,腳本以下,對具體StartDemo.bat命令很少作解釋安全

cd Demo_V2.0.4.9ui

cd mysqlspa

 

@echo off.net

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

相關文章
相關標籤/搜索