DOS 命令学习 Windows脚本 - %~dp0的含义 DOS批处理中%cd%和%~dp0的异同
更改当前目录为批处理本身的目录
有些晕吧?不急,我举例
比如你有个批处理a.bat在D:\QQ文件夹下
a.bat内容为
cd /d %~dp0
在这里
cd /d %~dp0的意思就是cd /d d:\qq
%0代表批处理本身 d:\qq\a.bat
~dp是变量扩充
d既是扩充到分区号 d:
p就是扩充到路径 \qq
dp就是扩充到分区号路径 d:\qq
扩充变量语法详解:
:: 选项语法:
:: ~I - 删除任何引号("),扩充 %I
:: %~fI - 将 %I 扩充到一个完全合格的路径名
:: %~dI - 仅将 %I 扩充到一个驱动器号
:: %~pI - 仅将 %I 扩充到一个路径
:: %~nI - 仅将 %I 扩充到一个文件名
:: %~xI - 仅将 %I 扩充到一个文件扩展名
:: %~sI - 扩充的路径只含有短名
:: %~aI - 将 %I 扩充到文件的文件属性
:: %~tI - 将 %I 扩充到文件的日期/时间
:: %~zI - 将 %I 扩充到文件的大小
:: %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
:: 到找到的第一个完全合格的名称。如果环境变量名
:: 未被定义,或者没有找到文件,此组合键会扩充到
:: 空字符串
:: 可以组合修饰符来得到多重结果:
:: %~dpI - 仅将 %I 扩充到一个驱动器号和路径
:: %~nxI - 仅将 %I 扩充到一个文件名和扩展名
:: %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
:: %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
:: 到找到的第一个驱动器号和路径。
:: %~ftzaI - 将 %I 扩充到类似输出线路的 DIR
----------------------------
在DOS的批处理中,有时候需要知道当前的路径。在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0。
这两个变量的用法和代表的内容一般是不同的。
1. %cd% 可以用在批处理文件中,也可以用在命令行中;展开后,是驱动器盘符:+当前目录,如:
在 c:\dir 下,
- echo %cd%
echo %cd%
显示为,
- c:\dir
c:\dir
%cd%的时间内容是可以被改变的,比如CD命令就可以改变它的内容。
2. %~dp0 只可以用在批处理文件中,它是由它所在的批处理文件的目录位置决定的,是批处理文件所在的盘符:+路径。在执行这个批处理文件的过程中,它展开后的内容是不可以改变的。
比如在D盘下有个批处理文件,dirshow.bat:
- @echo off
- echo this is %%cd%% %cd%
- echo this is %%~dp0 %~dp0
@echo offecho this is %%cd%% %cd%echo this is %%~dp0 %~dp0
在C:\ 下执行它,输出为:
- C:\>D:\dirshow.bat
- this is %cd% C:\
- this is %~dp0 D:\
求取bat文件运行目录并将路径写入注册表的代码
比如Bat文件运行目录是E:\Tencent\QQ\,
则自动写入bat文件内制定的注册表项键值。
我自己组织的代码不知道对不对:
制作升级包:用WinRAR自解压读取注册表中的信息来作为自解压路径
在注册表中有软件的安装路径,现做了个软件的升级包,用WinRAR做的,想在自解压的时候让WinRAR自动到注册表中找到软件安装路径,作为自己的自解压路径.
以下方法可实现:
比如安装的程序Test,已安装到Program Files\Test下面,对应注册表项hklm\software\test下的install值
对Test的升级程序进行打Winrar自解压包,添加自解压脚本setup.bat
- BatchFile code
- @echo offfor /f "tokens=2,*" %%i in ('reg query hklm\software\test /v install') do set apppath="%%j\"copy a.exe %apppath% /ycopy b.exe %apppath% /yecho okpause>nul