2010-01-31 5 views
8

Ce qui suit fonctionne principalement. 'Mostly', parce que l'utilisation du SOMETHING .. \ tasks \ pathname désynchronise Spring lorsqu'un fichier XML de contexte tente d'en inclure un autre par un chemin relatif. Donc, ce dont j'ai besoin, c'est d'un moyen, dans un fichier BAT, de définir une variable dans le répertoire parent d'un chemin.fichier bat: get parent pathname

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

Répondre

17

Pour résoudre un nom de chemin relatif, vous pouvez utiliser un appel de sous-routine. A la fin de votre lieu de fichier batch les lignes suivantes: Variable

GOTO :EOF 

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

Ceci est une routine sous qui résout son premier paramètre à un chemin complet (%~f1) et stocke le résultat au (global) nommé par le 2ème paramètre

vous pouvez utiliser la routine comme ceci:

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

Après l'appel, vous pouvez utiliser la %PARENT_ROOT% variable qui contient le nom de chemin parent contenu dans le %ROOT% variable.

Votre fichier lot complet devrait ressembler à ceci:

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, bonne idée. J'aurais abusé de 'pushd',' popd' et '% CD%' mais celui-ci est plus élégant, en fait. – Joey

+0

@Johannes: Merci, j'ai aussi pensé à 'pushd' et' popd', mais je ne me souviens plus de la variable '% CD%'. Donc, cette façon était plus évidente pour moi. –

+0

Paraphraser Perl: * »Fichiers batch: Il y a plus d'une façon de le faire« * ;-) – Joey

7

Voici une doublure

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

Pour développer le accepted answer, si vous voulez garder marcher le chemin (pour obtenir le répertoire parent des parents, par exemple), la bande slash:

: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 

Utilisation:

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

céderais C:\My\Path de C:\My\Path\Child\file.bat. Si je l'ai mieux compris, je suggérerais une "fonction wrapper" afin que vous puissiez CALL :REMOVE_SEGMENTS %path% 3 PARENT enlever les 3 derniers segments de %path%.

Questions connexes