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

如何获得运行脚本的目录并在.cmd文件中使用它?

雷蒙德有几个想法:

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

因为MSDN档案往往有些不可靠:

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

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

(我喜欢使用%_%作为我的临时环境variables。)

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

此外,文章中的评论是值得扫描例如这一个:

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

这涵盖了使用%〜dp0:

如果你想知道batch file的位置: %~dp0

%0是batch file的名称。 ~dp给你指定参数的驱动器和path。

这相当于脚本的path:

 %~dp0 

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

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

ss64.com有关于参数扩展语法的更多信息。 这里是相关的摘录:

你可以在命令行上使用%,然后在数字位置得到任何参数的值。

[…]

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

[…]

%〜d1仅将%1扩展为驱动器盘符 – C:

[…]

%〜p1将%1展开为仅path,例如\ utils \ this包含尾部\,可能会被一些命令解释为转义字符。

[…]

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

%〜dp1仅将%1扩展为驱动器号和path

[…]

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

 for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d pushd %curdir% 

资源