如何在与Windows批处理文件相同的目录中执行程序?

95

在同一个文件夹中,我有一个 .bat 文件和一个 .exe 文件。 除非我提供完整的绝对路径,否则无法从 .bat 文件中调用 .exe 文件。 有没有办法不指定路径呢?


请注意:您无法运行a.cmd.\\a.cmd,因为当前 shell 的工作目录不是批处理文件所在的目录。 - Константин Ван
3个回答

193
尝试使用%~dp0调用.exe,像这样:%~dp0MyProgram.exe%0 包含被调用的 .bat 文件的完整路径。 ~dp 表示获取驱动器和路径,包括尾随的 \

2
刚在谷歌搜索中发现了这个链接 - http://weblogs.asp.net/whaggard/archive/2005/01/28/get-directory-path-of-an-executing-batch-file.aspx - house9
31
Patrick Cuff的上面的答案是有效的,但如果目录路径的某部分名称中有空格,则会失败。为了解决这个问题,您需要在.exe调用周围放置双引号。 "%~dp0MyProgram.exe" - Stephen C
谢谢,我已经寻找这个答案有一段时间了,没有什么是如此高效或适合我的问题! - MD XF
2
作为对这个答案的补充,如果你将执行路径更改为当前目录,可以使用以下方式:cd "%~dp0",然后你可以直接调用MyProgram.exe。 - Thomas Mulder
非常感谢您的解释。 - Tarek

35

我通过在脚本开头使用pushd来更改工作目录,并在脚本结尾使用popd来恢复原始目录。这样你就可以始终将工作目录视为bat文件的位置。

pushd %~dp0
ProgramInSameFolderAsBat.exe
popd

1
请注意,更改工作目录可能会对执行的文件/脚本产生副作用。在我的情况下,我需要工作目录保持不变。@Patrick Cuff的答案考虑到了这一点。 - Bilal Akil
这段代码运行效果最佳!我会在 pushd %~dp0 之前添加 set workpath=%cd%,以保留对工作路径的引用,如果需要,可以将其传递给 .exe 文件,例如 ProgramInSameFolderAsBat.exe -workingpath "%workpath%" %* - Dimitar Atanasov

0
正如Stephen C所说,为了正确地支持带空格的路径,我们可以使用以下命令: start "%~dp0" "myfile.exe" 或者带参数的命令: start "%~dp0" "myfile.exe" -my_arguments

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