2010-01-31 8 views
8

Das folgende funktioniert meistens. 'Mostly', weil die Verwendung von SOMETHING .. \ tasks \ Pfadname Spring verwechselt, wenn eine XML-Kontextdatei versucht, eine andere nach relativem Pfadnamen einzubeziehen. Was ich also brauche, ist eine Möglichkeit, in einer BAT-Datei eine Variable auf das übergeordnete Verzeichnis eines Pfadnamens zu setzen.Fledermaus-Datei: Elternpfadname

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

Antwort

17

Um einen relativen Pfadnamen aufzulösen, können Sie einen Unterprogrammaufruf verwenden. Am Ende Ihres Batch-Datei Ort der folgenden Zeilen:

GOTO :EOF 

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

Dies ist ein Unterprogramm, das seinen ersten Parameter auf einen vollständigen Pfad (%~f1) und speichert das Ergebnis in dem (globalen) Variable, die durch die genannten löst 2. Parameter

können Sie die Routine wie folgt verwenden:

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

Nach dem Gespräch können Sie die Variable %PARENT_ROOT% benutzen, die den übergeordneten Pfadnamen in derenthaltenen enthältVariable.

Ihre vollständige Batch-Datei sollte wie folgt aussehen:

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, nette Idee. Ich hätte "Pushd", "Popd" und "% CD%" missbraucht, aber dieser ist eigentlich eleganter. – Joey

+0

@Johannes: Danke, ich dachte auch an 'Pushd' und' Popd', aber ich konnte mich nicht mehr an die '% CD% 'Variable erinnern. Also war dieser Weg für mich offensichtlicher. –

+0

Paraphrasieren Perl: * »Batch-Dateien: Es gibt mehr als eine Möglichkeit, es zu tun« * ;-) – Joey

7

Hier ist ein Einzeiler

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

auf dem accepted answer zu erweitern, wenn Sie den Pfad Aufmarsch halten wollen (um B. das Elternverzeichnis des Elternteils), den folgenden Schrägstrich zu entfernen:

Verwendung:

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

würde C:\My\Path von C:\My\Path\Child\file.bat ergeben.

Wenn ich es besser verstanden habe, würde ich vorschlagen, eine "Wrapper-Funktion", so dass Sie CALL :REMOVE_SEGMENTS %path% 3 PARENT die letzten 3 Segmente von %path% abziehen können.