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

Mis*_*hko 301 windows batch-file

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

我愿意path等于c:\path\to\my\file

我怎么能实现这一目标?

Dea*_*ing 511

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

要删除最后的反斜杠,可以使用:n,msubstring语法,如下所示:

SET mypath=%~dp0
echo %mypath:~0,-1%
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我不相信有一种方法可以将%0语法与:~n,m语法结合起来.

  • 很好......我一直在使用`%~0\..`--知道必须有更好的方法!另外,如果目录名中有空格等,你可能想用双引号(`""`)括起`%~dp0`. (7认同)
  • 如果尾部反斜杠干扰,只需添加一个点“.”;不要像您那样删除“\”,因为当脚本位于驱动器的根目录中时,这会导致意外的相对路径,因为“D:\”(绝对)和“D:”(相对)可能指向不同的位置,具体取决于当前工作目录,但“D:\.”仍然是绝对的...... (4认同)
  • 您只需在末尾添加一个“.”,而不是删除结尾的反斜杠。它的工作方式与当前目录“SET mypath=%~dp0”完全相同。 (3认同)
  • 即使路径中有空格,答案中的示例也可以在没有引号的情况下正常工作。(例如`SET msg=hello world` 工作正常)。但是,当在其他地方使用 %mypath% 时,您要小心在引号中使用它,尽管 `cd` 也不需要它们。 (2认同)
  • 那些不能组合是“不幸的”,因为世界肯定需要更多的`%~dp0:~0,-1$`。仍然 - 非常好的答案。 (2认同)
  • 该链接现在是404 (2认同)

小智 12

%~dp0可能是相对路径.要将其转换为完整路径,请尝试以下方法:

pushd %~dp0
set script_dir=%CD%
popd
Run Code Online (Sandbox Code Playgroud)

  • `%~dp0`不能包含相对路径,`d`代表驱动器,'p`代表路径,驱动器如何相对? (8认同)
  • 好的,为什么不直接使用`%~dp0`? (5认同)
  • 5年后发布的接受答案的更糟糕的版本?我不明白. (4认同)
  • 在哪个世界?我刚刚在Windows Server 2012 r2上测试了这个答案,结果是`%~dp0`将是一个绝对路径,即使脚本作为相对路径运行.感谢jeb的评论,我并没有被这个答案所迷惑.为什么人们只是编造东西然后开始将他们狂野的想象力传播给他人.我有这个同事这样做,但我责怪他(年轻)的年龄.我希望我的投票能得到重视. (3认同)

Adi*_*r D 12

%~dp0 - 返回脚本执行的路径

但是,还需要了解以下一个:

%CD% - 在运行时返回当前路径,例如,如果您使用“cdfolder1”进入其他文件夹,然后使用“cdfolder2”进入其他文件夹,它将返回完整路径,直到folder2和不是脚本所在的原始路径


小智 10

您可以使用以下脚本来获取路径而不尾随"\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
Run Code Online (Sandbox Code Playgroud)

  • @dcp呃,确实如此. (4认同)