файл bat: получить родительский путь

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

set ROOT=%~dp0
java -Xmx1g -jar %ROOT%..libajar.jar %ROOT%..tasksfas-model.xml tasks

3 ответов


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

GOTO :EOF

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

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

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

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

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

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

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

: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%.