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


328

我知道其中%0包含批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat

path等于c:\path\to\my\file

我该如何实现?




1
顺便说一句:如果使用相对命令行调用bat,则%0不包含完整路径。因此,“%〜dpf0”在这种情况下会更可靠。
eckes

Answers:


561

%~dp0将是目录。这是有关所有路径修饰符的一些文档。好玩的东西 :-)

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

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

不幸的是,我不相信有一种将%0语法与:~n,m语法结合的方法。


7
太好了...我一直在使用%~0\..-知道必须有更好的方法!此外,你可能会想括%~dp0在双引号("")的情况下,有在目录中的名称等空间
卡梅伦

1
不错!但是,%~dp0末尾包含``。您知道如何删除它吗?
Misha Moroshko 2010年

1
@Misha:我想你的意思是最后如何删除'\'。我已经详细更新了我的答案。
Dean Harding 2010年

2
答案中的示例即使路径中有空格,也可以使用引号将其引号引起来。(例如,SET msg=hello world工作正常)。但是,当在其他地方使用%mypath%时,您要小心使用引号,尽管cd两者都不需要。
Martin Pain

2
该链接现在是404
StingyJack

12

您可以使用以下脚本获取路径,而无需在路径后加上“ \”

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

但是,这不会从路径中删除文件名(例如,在OP的示例中为abc.txt)。
dcp

4
@dcp嗯,但是可以。
凯尔·斯特兰德

@Kyle Strand-是的,我再次尝试过,现在工作正常。我不确定最初尝试时会发生什么,也许我在脚本中的某个地方犯了一个错误。抱歉给您带来的困惑,并感谢您指出。
dcp

11

%~dp0可能是相对路径。要将其转换为完整路径,请尝试如下操作:

pushd %~dp0
set script_dir=%CD%
popd

6
好的,为什么不直接使用%~dp0呢?
jpaugh

5
5年后发布的接受答案的更差版本?我不明白
凯尔·斯特兰德

我想这是为了解决已接受答案的评论中提到的问题而发布的- %~dp0可以是相对的,根据用例的不同,可能是或不是问题
Michael Mrozek

10
%~dp0不能包含相对路径,d代表驱动器和p路径,驱动器如何相对?
jeb

5
在哪个世界?我刚刚在Windows Server 2012 r2上测试了此答案,事实证明,%~dp0即使脚本作为相对路径运行,它也将是绝对路径。感谢jeb的评论,这个答案并没有使我迷惑。人们为什么要编造东西然后开始将狂野的想象力传播给他人。我有一个这样做的同事,但我指责他的年龄(年轻)。我希望我的不赞成票算数。
bitoolean

0

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

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


1
除了9岁的答案外,我没有更多的信息
jeb

额外的信息是“ d表示仅驱动器,...”等。谢谢@Hayz。
RJ Dunnill


-7

那将是%CD%变量。

@echo off
echo %CD%

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


35
%CD%返回脚本是从,而不是目录中运行目录下的脚本是英寸
米沙Moroshko

4
它仅在您的脚本未修改工作目录的情况下才有效。试试CD C:\Temp <CR> ECHO %CD%<CR>是换行符...)
院长哈丁

6
另外,如果右键单击脚本并选择“以管理员身份运行”,则无论脚本位于何处,当前起始目录均为C:\ Windows \ System32。
卡梅伦2010年

尽管这不是对OP问题的直接答案,但是这种功能的风格恰恰是我发现此问题时一直在寻找的东西。谢谢!
佐尔坦

发布的其他解决方案似乎都无法在Win7 32位cmd.exe上对我起作用,这至少对我有用。
克利福德

-8

我正在Windows 7计算机上工作,最终使用下面的代码行获取了bash脚本的绝对文件夹路径。

在查看http://www.linuxjournal.com/content/bash-parameter-expansion后,我得到了该解决方案。

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
OP正在询问Windows BAT / CMD Shell脚本,而不是bash。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.