如何在 Windows 中获取批处理脚本的路径?
Posted
技术标签:
【中文标题】如何在 Windows 中获取批处理脚本的路径?【英文标题】:How to get the path of the batch script in Windows? 【发布时间】:2011-04-19 03:50:00 【问题描述】:我知道%0
包含批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat
我会 path
等于 c:\path\to\my\file
我怎样才能做到这一点?
【问题讨论】:
Command line .cmd/.bat script, how to get directory of running script的可能重复 How to pass command line parameters to a batch file?的可能重复 顺便说一句:如果使用相对命令行调用 bat,则 %0 不包含完整路径。所以“%~dpf0”在这种情况下会更可靠。 【参考方案1】:%~dp0
将是目录。 Here's some documentation on all of the path modifiers。有趣的东西:-)
要删除最后的反斜杠,您可以使用:n,m
子字符串语法,如下所示:
SET mypath=%~dp0
echo %mypath:~0,-1%
不幸的是,我不相信有办法将%0
语法与:~n,m
语法结合起来。
【讨论】:
非常好...我一直在使用%~0\..
——知道必须有更好的方法!此外,您可能需要将 %~dp0
括在双引号 (""
) 中,以防目录名称中有空格等。
不错!但是,%~dp0
在末尾包含 ``。你知道如何删除它吗?
@Misha:我假设您的意思是如何删除最后的“\”。我已经用详细信息更新了我的答案。
即使路径中有空格,答案中的示例也可以在没有引号的情况下正常工作。 (例如SET msg=hello world
工作正常)。但是,当在其他地方使用 %mypath% 时,您要小心在引号中使用它,尽管 cd
也不需要它们。
这些不能合并是“不幸的”,因为世界肯定需要更多的%~dp0:~0,-1$
。仍然——非常好的答案。【参考方案2】:
那就是%CD%
变量。
@echo off
echo %CD%
%CD%
返回批处理脚本所在的当前目录。
【讨论】:
%cd% 返回运行脚本的目录,而不是脚本所在的目录。 它仅在您的脚本不修改工作目录时才有效。试试CD C:\Temp <CR> ECHO %CD%
(<CR>
是换行符...)
另外,如果您右键单击脚本并选择“以管理员身份运行”,则无论脚本位于何处,当前起始目录都是 C:\Windows\System32。
虽然它不是对 OP 问题的直接回答,但当我发现这个问题时,这种功能的味道正是我所寻找的。谢谢!
在 Win7 32bit cmd.exe 上发布的其他解决方案似乎都不适合我,这至少对我有用。【参考方案3】:
我正在使用 Windows 7 机器,我最终使用下面的行来获取我的 bash 脚本的绝对文件夹路径。
在查看http://www.linuxjournal.com/content/bash-parameter-expansion 后,我得到了这个解决方案。
#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="$filename%\\*"
#Echo...
echo $filename
echo $folder
【讨论】:
OP 询问的是 Windows BAT/CMD shell 脚本,而不是 bash。【参考方案4】:%~dp0
可能是相对路径。
要将其转换为完整路径,请尝试以下操作:
pushd %~dp0
set script_dir=%CD%
popd
【讨论】:
好的,那为什么不直接使用%~dp0
呢?
我想这是为了解决已接受答案的 cmets 中提到的问题——%~dp0
可以是相对的,这可能是也可能不是问题,具体取决于用例
%~dp0
不能包含相对路径,d
代表驱动器,p
代表路径,驱动器怎么可能是相对的?
在哪个世界?我刚刚在 Windows Server 2012 r2 上测试了这个答案,结果发现 %~dp0
将是一个绝对路径,即使脚本作为相对路径运行也是如此。感谢jeb的评论,我没有被这个答案愚弄。为什么人们只是编造东西,然后开始向他人传播他们疯狂的想象力。我有一位这样做的同事,但我责怪他(年轻)的年龄。我希望我的反对票能算数。【参考方案5】:
您可以使用以下脚本来获取路径,而无需尾随“\”
for %%i in ("%~dp0.") do SET "mypath=%%~fi"
【讨论】:
这不会从路径中删除文件名(例如 OP 示例中的 abc.txt)。 @dcp 呃,确实如此。 @Kyle Strand - 是的,我又试了一次,现在工作正常。我不确定我最初尝试时发生了什么,也许我在脚本的某个地方犯了错误。很抱歉造成混乱,感谢您指出。【参考方案6】:您可以使用%~dp0
,d 表示仅驱动器,p 表示仅路径,0 是批处理文件的完整文件名的参数。
例如,如果文件路径是 C:\Users\Oliver\Desktop\example.bat,那么参数将等于 C:\Users\Oliver\Desktop\,您也可以使用命令 set cpath=%~dp0 && set cpath=%cpath:~0,-1%
并使用 @ 987654324@ 变量删除尾部斜杠。
【讨论】:
我看不到比 9 岁的答案更多的信息 额外信息是“d 仅表示驱动器,......”等。谢谢@Hayz。 除非你使用delayed expansion...【参考方案7】:%cd%
将为您提供脚本运行所在目录的路径。
只要运行:
echo %cd%
【讨论】:
%CD%
是当前工作文件夹,而不是存储批处理文件的文件夹。它们可以在同一个位置,但通常不是。【参考方案8】:
%~dp0 - 返回脚本执行的路径
但是,还需要了解以下一项:%CD% - 在运行时返回当前路径,例如,如果您使用 "cd 进入其他文件夹folder1",然后 "cd folder2",它将返回到 folder2 的完整路径,而不是脚本所在的原始路径
【讨论】:
以上是关于如何在 Windows 中获取批处理脚本的路径?的主要内容,如果未能解决你的问题,请参考以下文章