Batch file 命令行.cmd/.bat脚本,如何获取运行脚本的目录
如何获取已运行脚本的目录并在.cmd文件中使用它?Raymond Chen有一些想法: 此处引用全文是因为MSDN存档往往有点不可靠: 简单的方法是使用Batch file 命令行.cmd/.bat脚本,如何获取运行脚本的目录,batch-file,Batch File,如何获取已运行脚本的目录并在.cmd文件中使用它?Raymond Chen有一些想法: 此处引用全文是因为MSDN存档往往有点不可靠: 简单的方法是使用%CD%伪变量。它扩展到 当前工作目录 设置OLDDIR=%CD% 。。做事.. chdir/d%OLDDIR%&rem还原当前目录 (当然,目录保存/还原可能更容易实现。) 已经用pushd/popd完成了,但这不是重点。) %CD%技巧即使在命令行中也很方便。例如,我 我经常发现自己在一个目录中,那里有一个我想要的文件 做手术,但是。。。哦
%CD%
伪变量。它扩展到
当前工作目录
设置OLDDIR=%CD%
。。做事..
chdir/d%OLDDIR%&rem还原当前目录
(当然,目录保存/还原可能更容易实现。)
已经用pushd
/popd
完成了,但这不是重点。)
%CD%
技巧即使在命令行中也很方便。例如,我
我经常发现自己在一个目录中,那里有一个我想要的文件
做手术,但是。。。哦,我需要先转到别的目录
执行该操作
设置\%CD%\curfile.txt
cd。。。其他一些目录…
somecommand args%\uu%args
(我喜欢使用%\uu%
作为我的scratch环境变量。)
键入SET/?
查看命令提供的其他伪变量
处理器
此外,文章中的评论也非常值得扫描,例如这篇(通过WayBack机器,因为评论来自较旧的文章):
这涵盖了dp0的使用:
如果您想知道批处理文件的位置:%~dp0
%0
是批处理文件的名称~dp
为您提供
指定的参数
这相当于脚本的路径:
%~dp0
这使用批处理参数扩展语法。参数0始终是脚本本身
如果脚本存储在C:\example\script.bat
,则%~dp0
的计算结果为C:\example\
包含有关参数扩展语法的详细信息。以下是相关摘录:
可以在命令行中使用%后跟其数值位置来获取任何参数的值
[……]
使用参数提供文件名时,可以应用以下扩展语法:
[……]
%~d1仅将%1扩展为驱动器号-C:
[……]
%~p1仅将%1扩展到一个路径,例如。\utils\这包括一个尾随字符\可能被某些命令解释为转义字符
[……]
上述修改器可以组合使用:
%~dp1仅将%1扩展为驱动器号和路径
[……]
您可以使用%0获取批处理脚本本身的路径名,可以对此应用参数扩展,因此%dp0将返回批处理脚本的驱动器和路径,例如W:\scripts\
这并不能回答问题。%CD%给出了当前目录,而询问的是脚本的目录。@ketorin:这确实回答了问题。%如果脚本在整个使用过程中更改了目录(pushd/CD/),则CD%将更改,但%dp0不会更改,并且始终指向脚本所在的位置。-1我不知道这是否回答了问题。你能给我举个例子吗?@IainElder-你可能是对的,我几天前再次访问了这个答案,对它不太满意。我指的是陈雷蒙的博客上的评论,似乎受到了微软的猛烈抨击——因此,完全依赖外部链接的答案存在着危险。我确实试图找到一些其他材料来支持我的答案,但这已经是很久以前的事了。正在标记删除。谢谢你给我这个提示:)你不会碰巧为SkyScanner工作吧?@Kev如果你把有用的部分复制到Stack Overflow,可以参考外部来源。我想现在太晚了!是的,大家都知道我潜伏在Skyscanner数据中心;-)可能是我所需要的复制品。我将这个anwser链接到我的博客,作为提醒:)不确定引用的文本中是否有错误,但在我的脚本中,我需要“%~d0”来获取驱动器号!%~就我而言,d1是空的。在我看来,这比公认的答案要好。如果以“管理员”身份运行命令行脚本(右键单击),则将从Windows\system32执行脚本。接受的答案不会提供脚本位置,它会再次提供Windows\system32。也就是说,这个答案可以帮助你解决这个问题,你可以用cd%~dp0ATTENTION!%启动脚本~如果使用
cd/d
将目录更改为其他驱动器,dp0将中断!没有足够的文件或理由。
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d
pushd %curdir%