2010-08-09 236 views
2

我正在嘗試寫一個存在於任意目錄中的批處理文件,並且會在它上面創建一個新的目錄。例如,批處理文件在這裏:批處理文件目錄擴展

w:\src\project\scripts\setup.bat 

將創建:

w:\src\project.build 

我似乎無法弄清楚如何擴大的路徑。這是我目前在做什麼:

@set SCRIPT_DIR=%~dp0 
@set ROOT_DIR=%SCRIPT_DIR%\.. 
echo ROOT DIR: %ROOT_DIR% 
@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1% 
@echo ROOT DIR NAME: %ROOT_DIR_NAME% 

並且這產生:

ROOT DIR: w:\src\w_dev1\scripts\\.. 
ROOT DIR NAME: w:\src\w_dev1\scripts\\. 

我想做的事,就是讓ROOT_DIR_NAME是目錄本身(不帶斜線)。我知道我可以破解這個,並切換-1來說明'..',但是有沒有一種更清晰的方式來處理這個問題?

回答

4

您的行@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1%從變量值中刪除了1個字符。你想刪除更多('腳本'有7個,再加上這些'\ ..'在最後...)。你確定你總是把'腳本'作爲你安裝路徑中的最後一個目錄嗎?

無論如何,如果您使用@set ROOT_DIR_NAME=%ROOT_DIR:~0,-11%它應該適用於您的特定示例。

不過,我建議你用一個更通用的方法:

@set SCRIPT_DIR=%~dp0 
@pushd %script_dir% 
@pushd ..\.. 
@echo. current directory now is %cd% 
@set root_dir=%cd% 
@popd 
@popd 

這個獨立工作的目錄名的長度。

pushd命令更改目錄(並記住它來自哪裏) - popd命令返回到pushd記住的內容。變量%cd%保存當前驅動器+路徑。

+0

是否有必要'PUSHD%SCRIPT_DIR%',因爲你已經在腳本目錄開始(正確嗎?)?在我的簡單測試腳本中,這不是必要的,但也許我不知道在這裏玩的陷阱。 – Pat 2012-06-04 23:06:32

+0

@Pat:您需要'pushd%script_dir%',因爲您可能正在從另一個目錄運行腳本。例如從'w:\ src'中的命令提示符處,您可以運行'project \ scripts \ setup.bat'。此外,快捷方式有「目標」和「開始」屬性,並且「開始」目錄不必與目標批處理文件具有相同的目錄... – Grhm 2012-10-04 12:04:39

3

可以使用for命令來解決相對路徑爲規範的絕對路徑:

@echo off 
set "SCRIPT_DIR=%~dp0" 
for %%P in ("%SCRIPT_DIR%..\..") do set "ROOT_DIR_NAME=%%~fP" 

該腳本將設置ROOT_DIR_NAME到腳本的宏偉父目錄。

0

或本地子程序

call :setvartopath ROOT_DIR_NAME "%~dp0\..\.." 
goto :eof 

:setvartopath 
set %1=%~f2