How to get the path of the batch script in Windows?
我知道%0包含批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat。
我想用path等于c:\path\to\my\file。
我怎么能做到?
- 命令行.cmd/.bat脚本可能重复,如何获取运行脚本的目录
- 如何将命令行参数传递到批处理文件的可能副本?
- 如果用相对命令行调用BAT,则btw:%0不包含完整路径。所以"%~dpf0"在这种情况下更可靠。
目录将是%~dp0。下面是关于所有路径修饰符的一些文档。有趣的东西:
要删除最后的反斜杠,可以使用:n,m子字符串语法,如下所示:
1 2
| SET mypath=%~dp0
echo %mypath:~0,-1% |
不幸的是,我认为没有一种方法可以将%0语法与:~n,m语法结合起来。
- 杰出的。。。我一直在使用%~0\..,我知道必须有更好的方法!此外,如果目录名中有空格等,您可能需要将%~dp0括在双引号(""中)。
- 好极了!但是,%~dp0最后包含了`'。你知道如何移除它吗?
- @米莎:我想你的意思是怎么去掉结尾的'.''。我已经用细节更新了我的答案。
- 请注意,您应使用双引号将答案更新为@cameron提出的建议。:)
- 即使路径中有空格,答案中的示例也可以在没有引号的情况下正常工作。(例如,SET msg=hello world工作正常)。但是,在其他地方使用%mypath%时,您需要小心地在引号中使用它,尽管对于cd也不需要它们。
- 在Windows 8.1中,%~dp0的使用失败。它还可以报告调用程序的工作目录,而不能准确地报告脚本本身的实际文件位置。不确定这是否与当前的安全管理器有关,但是调用程序是来自WebServer的RunTime.ExcJava调用。
- 作为一种变体:如果使用类似于..\bin\myscript.cmd的相对路径调用脚本,PUSHD %~dp0; set mypath=%CD%; popd也可以工作。
- 不幸的是,这些不能结合在一起,因为世界肯定需要更多的%~dp0:~0,-1$。仍然——非常好的回答。
- 有什么方法可以使这个方法在符号链接中存活?
- 那个链接现在是404
- @StingyJack-这里是更新的链接:docs.microsoft.com/en-us/windows-server/administration/…
%~dp0可能是相对路径。要将其转换为完整路径,请尝试如下操作:
1 2 3
| pushd %~dp0
set script_dir=%CD%
popd |
- 好吧,那为什么不直接使用%~dp0?
- 5年后发表的更糟糕的答案?我不明白。
- 我想这是为了解决公认答案中提到的问题——%~dp0可以是相对的,这可能是或可能不是一个问题,具体取决于用例。
- %~dp0不能包含相对路径,d代表驱动器,p代表路径,驱动器怎么可能是相对的?
- 在哪个世界?我刚刚在WindowsServer2012 R2上测试了这个答案,结果发现即使脚本以相对路径运行,%~dp0也将是绝对路径。感谢杰布的评论,我没有被这个答案愚弄。为什么人们只是编些东西,然后开始把他们的疯狂想象传播给别人。我有一个同事这样做,但我责备他(年轻)的年龄。我希望我的反对票能算数。
可以使用以下脚本获取路径而不跟踪""。
1
| for %%i in ("%~dp0.") do SET"mypath=%%~fi" |
- 但这不会从路径中删除文件名(例如,op示例中的abc.txt)。
- @DCP呃,是的。
- @凯尔·斯特兰德-是的,我又试了一次,现在它工作得很好。我不知道我最初尝试的时候发生了什么,也许我在脚本的某个地方出错了。很抱歉弄混了,谢谢你指正。
您可以使用%~dp0,d表示仅驱动器,p表示仅路径,0表示批处理文件的完整文件名的参数。
例如,如果文件路径为c:usersoliverdesktopexample.bat,则参数等于c:usersoliverdesktop,还可以使用命令set cpath=%~dp0 && set cpath=%cpath:~0,-1%和使用%cpath%变量删除尾随斜杠。
我在一台Windows7机器上工作,最后我使用下面的行来获取bash脚本的绝对文件夹路径。
我在查看了http://www.linuxjournal.com/content/bash-parameter-expansion之后找到了这个解决方案。
1 2 3 4 5 6 7
| #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 |
- 操作程序询问的是windows bat/cmd shell脚本,而不是bash。
这就是%CD%变量。
%CD%返回批处理脚本所在的当前目录。
- %cd%返回运行脚本的目录,而不是脚本所在的目录。
- 不,实际上我自己测试过了:imgur.com/pzamu.jpg
- 只有当脚本不修改工作目录时,它才起作用。试一试CD C:\Temp ECHO %CD%(是新线…)
- 我明白了,谢谢你的澄清。
- 此外,如果右键单击脚本并选择"以管理员身份运行",则无论脚本位于何处,启动的当前目录都是C:windowssystem32。
- 虽然这不是OP问题的直接答案,但这种功能的味道正是我发现这个问题时所寻找的。谢谢!
- 发布的其他解决方案在win7 32位cmd.exe上似乎都不适用,这至少对我有用。
- @Clifford我认为这不应该取决于您的Windows版本是32位还是64位;其他一些可能有问题,请注意,如果工作目录不是包含脚本的目录,那么这绝对不应该起作用。
- @克利福德……你可能没有试图解决与原来问题相同的问题……?
- @Kylestrand:这个答案确实做了我想做的,但被否决了——我只是指出,它并非完全没有价值。我指定win7 32位并不是因为我的经验是该平台独有的,而是仅仅为了表明它至少在该平台上起作用(尽管可能在某种程度上是有限的),但最好不要像其他解决方案那样工作。我不知道其他解决方案失败了,也不再真正关心;18个月之后,它几乎不值得重新恢复。