2010-01-31 12 views
8

Aşağıdakiler çoğunlukla çalışır. 'Çoğunlukla' çünkü SOMETHING'in kullanımı .. \ task \ pathname, bir içerik XML dosyası başka bir göreli yol adı eklemeyi denediğinde Spring'i karıştırır. Yani, ihtiyacım olan şey bir BAT dosyasında, bir yol adının üst dizinine bir değişken koymanın bir yoludur.yarasa dosyası: üst yol adı olsun

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

cevap

17

Göreceli bir yol adını çözmek için alt rutin bir çağrı kullanabilirsiniz. senin toplu iş dosyası yerin sonunda aşağıdaki satırları:

GOTO :EOF 

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

Bu tam bir yolun (%~f1) için ilk parametreyi giderir bir alt rutindir ve tarafından adlandırılmış (global) değişkene sonucunu saklar Eğeriçerdiği ebeveyn yol adını içeren değişken %PARENT_ROOT% kullanabilirsiniz çağrısının ardından

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

: 2 parametre

böyle rutin kullanabilirsinizdeğişken.

Eksiksiz toplu iş dosyası aşağıdaki gibi görünmelidir:

İşte
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

Hm, güzel fikir. “Pushd”, “popd” ve “% CD%” yi kötüye kullanmıştım ama aslında bu daha şık. – Joey

+0

@Johannes: Teşekkürler, ayrıca 'pushd' ve' popd' hakkında da düşündüm, ama '% CD%' değişkenini daha fazla hatırlamadım. Böylece bu şekilde benim için daha açıktı. –

+0

Paraphrasing Perl: * »Toplu iş dosyaları: Bunu yapmanın birden fazla yolu var« * ;-) – Joey

7

Yolu yukarı yürüyen tutmak istiyorsanız

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

, accepted answer genişletmek için bir astar olan (olsun Örneğin, üst dizinin üst dizini), sondaki eğik çizgiyi şeritleyin:

: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 

Kullanım:

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 den C:\My\Path verecektir.

Daha iyi anlarsam, bir "sarmalayıcı işlevi" öneririm, böylece son 3 parçayı %path%'dan kesebilirsin.