命令行.cmd / .bat脚本,如何获取运行脚本的目录


Answers:


57

Raymond Chen有一些想法:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

在此处完整引用,因为MSDN存档往往有些不可靠:

最简单的方法是使用%CD%伪变量。它将扩展到当前工作目录。

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(当然,目录保存/恢复可以更容易地已经完成同pushd/ popd,但在这里不是问题的关键。)

%CD%即使从命令行,该技巧也很方便。例如,我经常在目录中找到我要操作的文件,但是...哦,我需要chdir到其他目录才能执行该操作。

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(我喜欢%_%用作我的临时环境变量。)

键入SET /?以查看命令处理器提供的其他伪变量。

另外,文章中的评论也很值得一读,例如(通过WayBack Machine,因为评论来自较早的文章):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

这涵盖了%〜dp0的用法:

如果您想知道批处理文件所在的位置: %~dp0

%0是批处理文件的名称。~dp给您指定参数的驱动器和路径。


13
这不能回答问题。%CD%提供当前目录,而询问的是脚本目录。
ketorin

3
@ketorin:确实回答了问题。如果脚本本身改变整个它的使用目录%CD%将发生变化(PUSHD / CD / ..),但%〜DP0改变,总是点到脚本所在。
杰伊

-1我不知道这是否回答了问题。能给我举个例子吗?
伊恩·塞缪尔·麦克莱恩

1
@IainElder-您可能是对的,几天前我重新访问了此答案,但对此不太满意。我指的是雷蒙德·陈(Raymond Chen)博客上的评论,似乎受到MS的抨击-因此,存在完全依赖于外部链接的答案的危险。我确实尝试找到其他材料来支持我的答案,但那是很久以前的事了。标记删除。谢谢你给我这个技巧:)你不是碰巧在SkyScanner上工作吗?
2013年

1
@Kev如果将有用的部分复制到Stack Overflow,可以引用外部资源。我想现在为时已晚!是的,我在Skyscanner数据中心潜伏着;-)
伊恩·塞缪尔·麦克莱恩

146

这等效于脚本的路径:

%~dp0

这使用批处理参数扩展语法。参数0始终是脚本本身。

如果您的脚本存储在C:\example\script.bat,则结果%~dp0C:\example\

ss64.com包含有关参数扩展语法的更多信息。以下是相关摘录:

您可以使用%来获取任何参数的值,然后在命令行上输入其数字位置。

[...]

当使用参数提供文件名时,可以应用以下扩展语法:

[...]

%〜d1仅将%1扩展为驱动器号-C:

[...]

%〜p1仅将%1扩展到路径,例如\ utils \,其中包括尾随\,某些命令可能会将其解释为转义字符。

[...]

上面的修饰符可以组合使用:

%〜dp1仅将%1扩展到驱动器号和路径

[...]

您可以使用%0获得批处理脚本本身的路径名,可以将参数扩展名应用到该脚本,因此%〜dp0会将驱动器和路径返回到批处理脚本,例如W:\ scripts \


正是我所需要的。提醒我,我将此链接链接到我的博客:)
Olivier H

不知道这是否是引用文本中的错误/错误,但是在我的脚本中,我需要“%〜d0”才能获得驱动器号!在我的情况下,%〜d1为空。
fklappan 2015年

在我眼中/情况上,这比公认的答案要好。如果您以“以管理员身份”运行命令行脚本(右键单击该脚本),将从Windows \ system32执行脚本。接受的答案将不会为您提供脚本位置,而是会再次为您提供Windows \ system32。即,这个答案可以帮助您解决问题,您可以使用cd%〜dp0启动脚本
JaroslavZáruba16年

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.