在编写批处理文件时,经常需要获取当前目录路径,然后根据当前路径进行文件定位;我们常用 %cd% 或者 %~dp0 来获取当前路径。
%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 可以用来获取批处理文件的实际路径,与当前 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 不会,因为代表的是脚本文件在磁盘的位置