批处理文件:获取父路径名

10
以下内容基本可行。之所以说“基本”,是因为当上下文XML文件尝试使用相对路径名包含另一个文件时,使用SOMETHING..\tasks\路径名会使Spring感到困惑。因此,我需要在BAT文件中设置一个变量,将其设置为路径名的父目录。
set ROOT=%~dp0
java -Xmx1g -jar %ROOT%\..\lib\ajar.jar %ROOT%\..\tasks\fas-model.xml tasks
3个回答

19

为了解析相对路径名,您可以使用一个子程序调用。 在批处理文件的末尾添加以下行:

GOTO :EOF

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

这是一个子程序,将其第一个参数解析为完整路径(%~f1),并将结果存储到由第二个参数命名的(全局)变量中。

您可以像这样使用该例程:

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

在调用后,您可以使用包含在%ROOT%变量中的父路径名的变量%PARENT_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

嗯,好主意。我本来想要滥用 pushdpopd%CD%,但这个更优雅实际上。 - Joey
@Johannes:谢谢,我也考虑过pushdpopd,但我不记得%CD%变量了。所以这种方式对我来说更明显。 - Frank Bollack
用不同的方式完成批处理文件,这就像是对 Perl 的改编:“»批处理文件:有多种方法可以实现«” ;-) - Joey

8
这是一个简短的说明。
for %%A in ("%~dp0\..") do set "root_parent=%%~fA"

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

如果我更理解这个问题,我会建议使用“包装函数”,这样你就可以通过 CALL :REMOVE_SEGMENTS %path% 3 PARENT 来从%path%中删除最后的3个部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接