2010-01-31 260 views
8

以下主要工作。 'Mostly',因为当上下文XML文件试图通过相对路径名包含另一个时,使用SOMETHING .. \ tasks \路径名会混淆Spring。所以,我似乎需要的是在BAT文件中,将变量设置为路径名的父目录。bat文件:获取父路径

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

回答

17

要解析相对路径名称,您可以使用子例程调用。 在您的批处理文件的地方结束以下行:

GOTO :EOF 

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

这是一个子例程,解决它的第一个参数为完整路径(%~f1),并把结果放在指定的(全局)变量第二个参数

您可以使用这样的程序:

CALL :RESOLVE "%ROOT%\.." PARENT_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 
+0

嗯,好主意。我会滥用'pushd','popd'和'%CD%',但实际上这个更优雅。 – Joey 2010-01-31 16:31:35

+0

@Johannes:谢谢,我也想过'pushd'和'popd',但我不记得'%CD%'变量了。所以这种方式对我来说更为明显。 – 2010-01-31 16:39:00

+0

Paraphrasing Perl:*»批处理文件:有多种方法可以完成这项工作«* ;-) – Joey 2010-01-31 16:52:24

7

这里是一个班轮

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

,如果你想保持踏着向上的路径扩大了accepted answer,(得到父的父目录,例如),剥去斜线:

: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

如果我理解的更好,我会建议一个“包装函数”,以便您可以从%path%中去掉最后3个段。