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