2010-01-31 255 views
8

以下主要工作。 'Mostly',因爲當上下文XML文件試圖通過相對路徑名包含另一個時,使用SOMETHING .. \ tasks \路徑名會混淆Spring。所以,我似乎需要的是在BAT文件中,將變量設置爲路徑名的父目錄。bat文件:獲取父路徑

set ROOT=%~dp0 
java -Xmx1g -jar %ROOT%\..\lib\ajar.jar %ROOT%\..\tasks\fas-model.xml tasks 

回答

17

要解析相對路徑名稱,您可以使用子例程調用。 在您的批處理文件的地方結束以下行:

GOTO :EOF 

:RESOLVE 
SET %2=%~f1 
GOTO :EOF 

這是一個子例程,解決它的第一個參數爲完整路徑(%~f1),並把結果放在指定的(全局)變量第二個參數

您可以使用這樣的程序:

CALL :RESOLVE "%ROOT%\.." PARENT_ROOT 

通話後,您可以使用變量%PARENT_ROOT%包含包含在父路徑名變量。

你完整的批處理文件應該是這樣的:

SET ROOT=%~dp0 

CALL :RESOLVE "%ROOT%\.." PARENT_ROOT 

java -Xmx1g -jar "%PARENT_ROOT%\lib\ajar.jar" "%PARENT_ROOT%\tasks\fas-model.xml" tasks 

GOTO :EOF 

:RESOLVE 
SET %2=%~f1 
GOTO :EOF 
+0

嗯,好主意。我會濫用'pushd','popd'和'%CD%',但實際上這個更優雅。 – Joey 2010-01-31 16:31:35

+0

@Johannes:謝謝,我也想過'pushd'和'popd',但我不記得'%CD%'變量了。所以這種方式對我來說更爲明顯。 – 2010-01-31 16:39:00

+0

Paraphrasing Perl:*»批處理文件:有多種方法可以完成這項工作«* ;-) – Joey 2010-01-31 16:52:24

7

這裏是一個班輪

for %%A in ("%~dp0\..") do set "root_parent=%%~fA" 
2

,如果你想保持踏着向上的路徑擴大了accepted answer,(得到父的父目錄,例如),剝去斜線:

:PARENT_PATH 
:: use temp variable to hold the path, so we can substring 
SET PARENT_PATH=%~dp1 
:: strip the trailing slash, so we can call it again to get its parent 
SET %2=%PARENT_PATH:~0,-1% 
GOTO :EOF 

用法:

CALL :PARENT_PATH "%~dp0" PARENT_ROOT 
CALL :PARENT_PATH "%PARENT_ROOT%" PARENT_ROOT 
echo Parent Root is: %PARENT_ROOT% 

將從C:\My\Path\Child\file.bat產生C:\My\Path

如果我理解的更好,我會建議一個「包裝函數」,以便您可以從%path%中去掉最後3個段。