9

以下主要工作。“主要是”,因为当上下文 XML 文件尝试通过相对路径名包含另一个文件时,使用 SOMETHING..\tasks\ 路径名会使 Spring 感到困惑。因此,我似乎需要一种在 BAT 文件中将变量设置为路径名的父目录的方法。

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

3 回答 3

18

要解析相对路径名,您可以使用子例程调用。在批处理文件的末尾放置以下行:

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
于 2010-01-31T16:22:52.427 回答
8

这是一个班轮

for %%A in ("%~dp0\..") do set "root_parent=%%~fA"
于 2012-11-15T13:05:44.093 回答
3

要扩展已接受的答案,如果您想继续前进(例如,获取父目录的父目录),请去掉尾部斜杠:

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

如果我更好地理解它,我会建议一个“包装函数”,这样你就可以CALL :REMOVE_SEGMENTS %path% 3 PARENT%path%.

于 2013-07-16T16:19:25.343 回答