2010-01-31 46 views
8

Lo siguiente funciona principalmente. 'Mayormente', porque el uso de ALGO ... \ tasks \ pathname confunde a Spring cuando un archivo XML de contexto intenta incluir a otro por el nombre de ruta relativo. Entonces, lo que parece necesitar es una forma, en un archivo BAT, de establecer una variable en el directorio padre de una ruta de acceso.bat archivo: obtener el nombre de ruta principal

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

Respuesta

17

Para resolver un nombre de ruta relativa, puede utilizar una llamada secundaria. Al final de su lugar de archivo por lotes las siguientes líneas:

GOTO :EOF 

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

Ésta es una sub-rutina que resuelve su primer parámetro a una ruta completa (%~f1) y almacena el resultado en la variable (global) nombrado por el segundo parámetro

usted puede utilizar la rutina de la siguiente manera:

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

Después de la llamada puede utilizar la variable %PARENT_ROOT% que contiene el nombre de la ruta primaria contenida en el %ROOT% variable.

su archivo por lotes completo debería tener este aspecto:

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, buena idea. Hubiera abusado de 'pushd',' popd' y '% CD%', pero este es más elegante, en realidad. – Joey

+0

@Johannes: Gracias, también pensé en 'pushd' y' popd', pero ya no recordaba la variable '% CD%'. Así que esta forma fue más obvia para mí. –

+0

Paraphrasing Perl: * »Archivos por lotes: hay más de una forma de hacerlo« * ;-) – Joey

7

Aquí es un chiste

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

para ampliar el accepted answer, si desea mantener marchando por el camino (para obtener el directorio padre de los padres, por ejemplo), desmonte la barra inclinada:

: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 

Uso:

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

produciría C:\My\Path de C:\My\Path\Child\file.bat.

Si lo entendí mejor, sugeriría una "función de envoltura" para que pueda CALL :REMOVE_SEGMENTS %path% 3 PARENT pelar los últimos 3 segmentos de %path%.

Cuestiones relacionadas