如何在批处理文件中使用相对路径?

3
我遇到了一个问题,需要在批处理脚本中给出硬编码路径的相对路径。
以下是我的soapUI cmd线执行文件,其中soapui-settings.xml是包含所有soap设置的文件,project.xml是我的测试用例。我在这里硬编码了路径。因为我要检查这个文件,如果其他人执行这个文件,它将无法工作,因为路径不存在于他们的机器上。我如何在Windows上实现这一点?是否有一种方法可以在批处理文件中使用相对路径来替代硬编码路径并运行它?
这是我的示例文件:
cd C:\soapui4.5\soapUI-Pro-4.5.0\bin  
testrunner.bat -tC:\Users\jvihol\soapui-settings.xml C:\Users\jvihol\Documents\April-RTM-soapui-project.xml

任何帮助都将不胜感激。谢谢 :)

谢谢Chuck。因此,我已经修改了批处理文件,使其如下所示:cd C:\soapui4.5\soapUI-Pro-4.5.0\bin testrunner.bat -EDefault -I -t....\soapui-settings.xml ....\April-RTM-soapui-project.xml 当我运行时,仍然无法找到文件或加载我的project.xml文件失败。有任何想法吗? - user1411397
你的样本文件中有一些类型错误。这是全部吗?你的批处理文件与*.xml文件相比位于何处? - ixe013
3个回答

5

以下是我用来解决路径变化的技巧。简而言之,

  1. 将所有路径与批处理文件位置相关联,并且
  2. 使批处理文件更改自身的工作目录。

如果您所调用的工具在路径中,或者位于由环境变量定义的位置,则会很有帮助。

类似这样:

@echo off

pushd %~dp0

REM Here you are executing in the same directory as the batch file
REM You can make your path relative to here

popd

对于您的项目,您可以使用相同的%~dp0作为绝对路径的占位符。

pushd C:\soapui4.5\soapUI-Pro-4.5.0\bin 
testrunner.bat -EDefault -I -t%~dp0soapui-settings.xml %~dp0April-RTM-soapui-project.xml
popd

1

也许您需要这个:

cd C:\soapui4.5\soapUI-Pro-4.5.0\bin  
testrunner.bat -t%USERPROFILE%\soapui-settings.xml %USERPROFILE%\Documents\April-RTM-soapui-project.xml

USERPROFILE 是一个系统环境变量,包含当前用户主目录的路径。在您的会话中,它将被评估为

C:\Users\jvihol

在别人的电脑上,也可以这样做。

C:\Users\<i>someone else's user name</i>

1

从相对路径获取绝对路径需要进行一些计算。我知道的三个选项是:i)使用仅进行路径计算的附加程序,ii)使用“当前目录”,以及iii)将两个路径拼接在一起。以下是方法ii)和iii)的大致说明:

REM example "givens"
set DRIVE=C:
set ROOTPATH=\fee\fie\fo
set RELPATH=funky\stuff
set FILENAME=blarf.txt

REM method ii) using the "current directory" functionality
%DRIVE%
cd %ROOTPATH%
cd %RELPATH%
more %FILENAME%

REM method iii) using explicit concatenation
set FULLPATH=%DRIVE%%ROOTPATH%\%RELPATH%
set PATHFILENAME=%FULLPATH%\%FILENAME%
more %PATHFILENAME%

REM DOS/BAT handling of drive letter is odd (is it part of the path, or not?)
REM It may be necessary to use "cd /D ..."

REM Path calculations are easier 
REM so long as DOS/BAT understands that "\\" is the same as "\"

谢谢Chuck。所以我已经修改了批处理文件,看起来像下面这样:cd C:\soapui4.5\soapUI-Pro-4.5.0\bin testrunner.bat -EDefault -I -t....\soapui-settings.xml ....\April-RTM-soapui-project.xml 当我运行它时,仍然会出现文件未找到或无法加载我的project.xml文件的错误。有什么想法吗? - user1411397
这是我会做的:打印出你的BAT文件,打开DOSBox,逐个输入打印纸上的命令,以查看发生了什么以及何时出现错误。 往往很难区分BAT文件本身中的问题与BAT文件调用的某个工具中的问题。 我怀疑在这种情况下存在一个 输错 问题。很容易(至少对我来说是这样)混淆破折号和下划线,是 RTM 还是 RMT 等等。 - Chuck Kollars
另一个想法:与大多数人习惯不同,BAT文件对标志和其参数之间的空格非常敏感,并且没有“标准”方法,如果它们不符合预期,它们将无法正常工作。也许只有“-t foo/bar”才能正常工作,或者可能只有“-tfoo/bar”才能正常工作。 - Chuck Kollars

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