如何在Windows中获取批处理脚本的路径?

426
我知道%0包含了批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat
我希望path等于c:\path\to\my\file
我该如何实现这个目标?

可能是如何将命令行参数传递给批处理文件?的重复问题。 - AStopher
2
顺便提一下:如果批处理文件是通过相对命令行调用的,那么%0不包含完整路径。因此,在这种情况下,“%~dpf0”会更可靠。 - eckes
8个回答

706

%~dp0将是该目录。 这里是有关所有路径修改器的一些文档。很有趣 :-)

要删除最后一个反斜杠,您可以使用:n,m子字符串语法,如下所示:

SET mypath=%~dp0
echo %mypath:~0,-1%

很遗憾,我不认为有一种方法可以将%0语法与:~n,m语法结合起来。


10
太好了!我一直在使用%~0\..,知道必须有更好的方法!此外,您可能需要用双引号("")将%~dp0括起来,以防目录名中有空格等问题。 - Cameron
3
答案中的示例即使路径中有空格也可以正常工作,而不需要引号(例如SET msg=hello world可以正常工作)。但是,在其他地方使用%mypath%时,您要小心使用引号,尽管对于cd也不需要。 - Martin Pain
4
“不幸的是”,这些无法组合,因为世界绝对需要更多包含“%dp0:0,-1$” 的内容。不过,非常好的回答。 - Kyle Strand
2
不需要删除尾部反斜杠,只需在末尾添加一个“.”即可。它将与当前目录SET mypath=%~dp0.完全相同。 - phuclv
3
如果尾部反斜杠令人不舒服,只需添加一个点“.”即可;请勿像您所做的那样删除\,因为这将导致当脚本位于驱动器的根目录时产生意外的相对路径。因为D:\(绝对路径)和D:(相对路径)可能指向不同的位置,具体取决于当前的工作目录,但是D:\.仍然是绝对路径... - aschipfl
显示剩余10条评论

19

%~dp0 可能是一个相对路径。要将其转换为完整路径,请尝试类似以下的方法:

pushd %~dp0
set script_dir=%CD%
popd

6
那么为什么不直接使用%~dp0呢? - jpaugh
1
我想这篇文章是为了解决接受答案评论中提到的问题而发布的——%~dp0可能是相对的,这取决于使用情况是否有问题。 - Michael Mrozek
20
%~dp0不能包含相对路径,d代表驱动器,p代表路径,驱动器怎么可能是相对的呢? - jeb
13
在哪个世界?我刚在Windows Server 2012 r2上测试了这个答案,结果发现即使脚本以相对路径运行,%~dp0仍将是绝对路径。感谢jeb的评论,我没有被这个答案愚弄。为什么人们会编造东西并开始向他人散播他们的狂想呢?我有个同事就是这样做的,但我责怪他(年轻)年龄。我希望我投的反对票能够算数。 - bitoolean

14
您可以使用以下脚本获取没有尾部“\”的路径。
for %%i in ("%~dp0.") do SET "mypath=%%~fi"

这并不会从路径中删除文件名(例如,在OP的示例中为abc.txt)。 - dcp
5
嗯,的确是这样。 - Kyle Strand
1
@Kyle Strand - 是的,我刚刚又试了一下,现在它正常工作了。我不确定当我最初尝试时发生了什么,也许我在脚本中犯了错误。对于造成的困惑,非常抱歉,感谢您指出问题。 - dcp

11

%~dp0 - 返回脚本执行的路径

但是,还需要知道以下内容:

%CD% - 返回运行时的当前路径,例如,如果您使用 "cd folder1" 进入其他文件夹,然后使用 "cd folder2",它将返回完整路径,直到 folder2,而不是脚本所在的原始路径。


3

您可以使用%~dp0,其中d表示仅驱动器,p表示仅路径,0是批处理文件的完整文件名的参数。

例如,如果文件路径为C:\Users\Oliver\Desktop\example.bat,则参数将等于C:\Users\Oliver\Desktop\,另外,您可以使用命令set cpath=%~dp0 && set cpath=%cpath:~0,-1%并使用%cpath%变量来删除尾随斜杠。


3
我看不到比9年前的答案更多的信息了。 - jeb
1
额外信息是“d表示仅驱动器,…”等。谢谢,@Hayz。 - R.J. Dunnill
1
你不能像那样在单行中删除尾部反斜杠,除非你使用延迟扩展 - aschipfl

2
如上所述,%~dp0将返回当前脚本的绝对驱动器和路径。重要提示:如果批处理脚本是通过被引号括起来的路径调用的,则%~dp0的实现会出现严重错误,无法正常工作。
由于cmd.exe是一个传统产品,微软拒绝修复此错误。有关详细信息,请参见https://github.com/microsoft/terminal/issues/15212

-7

%cd%会给你当前脚本所在的目录路径。

只需运行:

echo %cd%

4
%CD% 表示当前工作目录,而不是批处理文件所在的目录。它们可以是相同的位置,但通常不是。 - Stephan

-10

那将是 %CD% 变量。

@echo off
echo %CD%

%CD% 返回批处理脚本所在的当前目录。


41
%cd%返回的是脚本被运行的目录,而不是脚本所在的目录。 - Misha Moroshko
4
只有当你的脚本不修改工作目录时,它才有效。请尝试输入 CD C:\Temp <CR> ECHO %CD%(其中 <CR> 表示换行符)。 - Dean Harding
6
另外,如果您右键单击脚本并选择“以管理员身份运行”,则无论脚本位于何处,启动时的当前目录始终为C:\ Windows \ System32。 - Cameron
1
虽然这不是对楼主问题的直接回答,但这种功能确实是我在发现这个问题时正在寻找的。谢谢! - Zoltán
@Clifford... 可能你并没有尝试解决原问题吧? - Kyle Strand
显示剩余3条评论

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