获取磁盘路径 %~dp0

在编写批处理文件时,经常需要获取当前目录路径,然后根据当前路径进行文件定位;我们常用 %cd% 或者 %~dp0 来获取当前路径。

%cd%

%cd%  扩展到当前目录字符串。需要注意的是,这里的当前目录有可能和脚本实际所在目录不一致。实例:

@echo off
set basePath=%cd%
echo %basePath%

输出结果:

C:\Users\Administrator\Desktop> test.bat
C:\Users\Administrator\Desktop

rem 我们在 C:\Users\Administrator 目录执行脚本,输出的也是该目录
C:\Users\Administrator>call Desktop/test.bat
C:\Users\Administrator

%cd% 返回的是当前执行环境目录(如果是DOS窗口,则是DOS窗口里面的路径),并非是 bat 脚本实际所在的路径。

%~dp0

%~dp0 可以用来获取批处理文件的实际路径,与当前 DOS 环境所在的目录没有关系。其中:

  • %~dp0 的 “d” 为 Drive 的缩写,即为驱动器,磁盘;

  • %~dp0 的 “p” 为 Path 缩写,即为路径,目录;

我们可以使用 cd 命令转到 %~dp0 返回的目录,不过推荐使用 cd /d %~dp0。原因如下:

REM %~dp0 返回的路径带有盘符的,因此执行下面命令失败
C:\Users\Administrator\Desktop>cd D:\test
C:\Users\Administrator\Desktop>

REM 实际上,我们进入 D:\test 目录需要两步
REM 第一步:选择盘符
C:\Users\Administrator>D:

REM 第二步:进入 D:\test 目录
D:\>cd test

REM 使用 cd /d 命令
C:\Users\Administrator>cd /d D:\test
D:\test>

实例:获取批处理文件自身磁盘路径。

@echo off
set basePath=%~dp0
echo %basePath%

输出结果:

C:\Users\Administrator\Desktop> test.bat
C:\Users\Administrator\Desktop\

REM 在其他目录运行 test.bat
C:\Users\Administrator> call Desktop/test.bat
C:\Users\Administrator\Desktop\

更多选项语法:

  • ~0   删除任何引号("),扩充 %0

  • %~d0   仅将 %0 扩充到一个驱动器号

  • %~f0   将 %0 扩充到一个完全合格的路径名(“f” 是 file,即文件)

  • %~p0   仅将 %0 扩充到一个路径

  • %~n0   仅将 %0 扩充到一个文件名(“n” 是 name 文件名)

  • %~x0   仅将 %0 扩充到一个文件扩展名

  • %~s0   扩充的路径只含有短名(“s” 为 Short,短的)

  • %~a0   将 %0 扩充到文件的文件属性(“a” 为 attribute,即属性)

  • %~t0   将 %0 扩充到文件的日期/时间(“t” time)

  • %~z0   将 %0 扩充到文件的大小(Size 大小)

  • %~$PATH:0   查找列在路径环境变量的目录,并将 %0 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

实例:尝试使用的选项,查看每个选项的输出结果。

@echo off
REM C:
echo %~d0

REM C:\Users\Administrator\Desktop\test.bat
echo %~f0

REM \Users\Administrator\Desktop\
echo %~p0

REM test
echo %~n0

REM .bat
echo %~x0

REM C:\Users\ADMINI~1\Desktop\test.bat
echo %~s0

REM --a------
echo %~a0

REM 2020/06/10 13:27
echo %~t0

REM 141
echo %~z0

输出结果:

C:\Users\Administrator\Desktop>test.bat
C:
C:\Users\Administrator\Desktop\test.bat
\Users\Administrator\Desktop\
test
.bat
C:\Users\ADMINI~1\Desktop\test.bat
--a------
2020/06/10 13:27
141

可以组合修饰符来得到多重结果:

  • %~dp0    仅将 %0 扩充到一个驱动器号和路径

  • %~nx0    仅将 %0 扩充到一个文件名和扩展名

  • %~fs0    仅将 %0 扩充到一个带有短名的完整路径名

  • %~dp$PATH:0    查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。

  • %~ftza0     将 %0 扩充到类似输出线路的 DIR

  • %0 为当前批处理文件。如果0换成1为第一个文件,2为第2个

总结

%cd% 和 %~dp0 两者均可以获取到当前路径,而 %~dp0 获取的是批处理文件所在目录的路径,%cd% 获取的是当前 DOS 环境的路径。如果批处理文件和执行批处理文件不再同一目录,则 %cd% 返回的路径并不是批处理文件所在目录的路径,而是执行环境当前的路径。

%cd% 和 %~dp0 区别:

1)使用范围上的不同

  • %cd% 可以在批处理脚本(bat脚本)、命令行窗口中使用

  • %~dp0 只能在批处理脚本(bat脚本) 中使用

2)bat 脚本执行时,两者代表的值是否会变化

  • %cd% 会,因为代表的是当前目录

  • %~dp0 不会,因为代表的是脚本文件在磁盘的位置

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号