bat файл: получить родительский путь - PullRequest
8 голосов
/ 31 января 2010

Следующее в основном работает. «В основном», поскольку использование SOMETHING .. \ tasks \ pathname сбивает с толку Spring, когда XML-файл контекста пытается включить другой по относительному пути. Итак, мне кажется, что в BAT-файле нужно установить переменную в родительский каталог с именем пути.

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

Ответы [ 3 ]

17 голосов
/ 31 января 2010

Чтобы разрешить относительный путь, вы можете использовать подпрограмму вызова. В конце вашего командного файла поместите следующие строки:

GOTO :EOF

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

Это подпрограмма, которая разрешает свой первый параметр в полный путь (%~f1) и сохраняет результат в (глобальной) переменной, названной вторым параметром

Вы можете использовать процедуру следующим образом:

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

После вызова вы можете использовать переменную %PARENT_ROOT%, которая содержит родительский путь, содержащийся в переменной %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
7 голосов
/ 15 ноября 2012

Вот один лайнер

for %%A in ("%~dp0\..") do set "root_parent=%%~fA"
2 голосов
/ 16 июля 2013

Чтобы развернуть принятый ответ , если вы хотите продолжать маршировать по пути (например, для получения родительского каталога родителя), удалите косую черту:

: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 с C:\My\Path\Child\file.bat.

Если бы я понял это лучше, я бы предложил "функцию-обертку", чтобы вы могли CALL :REMOVE_SEGMENTS %path% 3 PARENT убрать последние 3 сегмента из %path%.

...