2010-10-03 97 views
6

在我的蝙蝠劇本,我調用另一個腳本,並傳遞一個字符串參數.BAT當前文件夾的名稱

cscript log.vbs "triggered from folder <foldername> by Eric" 

的字符串參數,你可以看到包含該腳本是文件夾的名稱被稱爲。什麼是正確的方式來通過這動態插入這個文件夾名稱的腳本?

回答

18

如果你想你在哪裏目前是目錄,你可以從%cd%。這是你目前的工作目錄。

如果你想成爲改變腳本執行期間當前工作目錄,只需將它保存在啓動:

set startdir=%cd% 

,那麼你可以在你的代碼中使用%startdir%不管任何更改後(影響%cd%)。


如果你只想得到這條道路的最後組件(根據您的評論),您可以使用以下作爲基準:

 
    @setlocal enableextensions enabledelayedexpansion 
    @echo off 
    set startdir=%cd% 
    set temp=%startdir% 
    set folder= 
:loop 
    if not "x%temp:~-1%"=="x\" (
     set folder=!temp:~-1!!folder! 
     set temp=!temp:~0,-1! 
     goto :loop 
    ) 
    echo.startdir = %startdir% 
    echo.folder = %folder% 
    endlocal && set folder=%folder% 

此輸出:

 
    C:\Documents and Settings\Pax> testprog.cmd 
    startdir = C:\Documents and Settings\Pax 
    folder = Pax 

它通過從完整路徑末尾複製字符,一次一個,直到找到\分隔符。它既不漂亮,也沒有效率,但Windows批處理編程很少是:-)

編輯

其實,有一個簡單而非常有效的方法來獲得的最後一個組件名稱。

for %%F in ("%cd%") do set "folder=%~nxF" 

不爲這種情況的一個問題,但如果你是在處理包含可能會或可能不會與\結束路徑的變量,那麼你可以通過附加\.

for %%F in ("%pathVar%\.") do set "folder=%~nxF" 
+1

@Berming,我已經添加了代碼,它會給你路徑的最後一個組件。查看更新。 – paxdiablo 2010-10-03 08:28:19

+0

正是我所需要的,非常感謝。我注意到,雖然我'endlocal'後我不能訪問'文件夾'變量,所以我拿出了那一行。我想,因爲我刪除了該行,我還應該刪除頂部的@setlocal enableextensions enabledelayedexpansion',但刪除該行會導致問題,所以我保留了那一行。 – Berming 2010-10-03 11:25:17

+2

@Berming,看到更新。如果你離開'endlocal',它會影響你以後。你可以使用'setlocal/endlocal'來確保延遲擴展能夠正常工作,但是將'endlocal'修改爲'endlocal && set folder =%folder%',以便'folder'變量能夠轉義。 – paxdiablo 2010-10-04 03:42:50

8
+1

保證正確的結果這給出了蝙蝠腳本存儲的文件夾,可能與腳本被調用的地方不一樣,所以它不適用於我的情況,因爲它幾乎總是從不同的位置調用從腳本實際存儲的位置開始。 – Berming 2010-10-03 04:47:26

+1

對!抱歉。好的,我將這裏的答案留作參考 - 有人可能會發現'%〜dp0'對某些目的有用。 – Isaac 2013-04-01 06:21:00

相關問題