Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 命令行.cmd/.bat脚本,如何获取运行脚本的目录_Batch File - Fatal编程技术网

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

Batch file 命令行.cmd/.bat脚本,如何获取运行脚本的目录,batch-file,Batch File,如何获取已运行脚本的目录并在.cmd文件中使用它?Raymond Chen有一些想法: 此处引用全文是因为MSDN存档往往有点不可靠: 简单的方法是使用%CD%伪变量。它扩展到 当前工作目录 设置OLDDIR=%CD% 。。做事.. chdir/d%OLDDIR%&rem还原当前目录 (当然,目录保存/还原可能更容易实现。) 已经用pushd/popd完成了,但这不是重点。) %CD%技巧即使在命令行中也很方便。例如,我 我经常发现自己在一个目录中,那里有一个我想要的文件 做手术,但是。。。哦

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

Raymond Chen有一些想法:

此处引用全文是因为MSDN存档往往有点不可靠:

简单的方法是使用
%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%