批处理文件的相对路径问题

在注册控件的时候,我一般会在OCX或DLL目录下放一个reg.bat,注册控件的时候就会比较方便些,但遇到WIN7之类对权限有要求的系统,有点让人无奈,总是提示找不到控件依赖的其他二进制文件,例如IECS2.DLL依赖IMAP.DLL,在注册IECS2.DLL时,会出现如下图所示的问题

很显然的问题是路径不对,可是路径究竟是怎么一回事呢?

一般来说,批处理文件处理相对路径的时候,起始位置是bat文件所在的目录,比如在D:\XX目录下执行bat文件,所有相对目录的操作都会以D:\XX下执行。

但是有些命令需要管理员权限,右键选择以管理员身份运行时后,起始位置则为C:\Windows\system32,这时候往往不是我们所想要的,

一种解决解决办法是在批处理的行首加一句"cd D:\XX”进入该目录,以修改其当前位置,但这样需要在批处理文件中加入绝对路径,如果把bat文件移动到其它位置就无法使用了,此时一种更好的方式是用"cd /d %~dp0”代替"cd D:\XX”。

综上所述,在写bat文件的时候,不管是否需要用到管理员权限,最好在行首加一句"cd /d %~dp0",以统一文件的起始目录。

那么这个 cd
/d %~dp0 到底是什么意思呢?

%~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录
cd是转到这个目录,不过我觉得cd /d %~dp0 还好些

选项语法:

    ~0         - 删除任何引号("),扩充 %0
    %~f0        - 将 %0 扩充到一个完全合格的路径名(“f”是file,即文件)
    %~d0        - 仅将 %0 扩充到一个驱动器号
    %~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 扩充
                  到找到的第一个完全合格的名称。如果环境变量名
                  未被定义,或者没有找到文件,此组合键会扩充到
                  空字符串

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

    %~dp0       - 仅将 %0 扩充到一个驱动器号和路径
    %~nx0       - 仅将 %0 扩充到一个文件名和扩展名
    %~fs0       - 仅将 %0 扩充到一个带有短名的完整路径名
    %~dp$PATH:0 - 查找列在路径环境变量的目录,并将 %I 扩充
                  到找到的第一个驱动器号和路径。
    %~ftza0     - 将 %0 扩充到类似输出线路的 DIR

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

举例说明

cd /d %~dp0是什么意思啊?
是dos的批处理命令。

意思是
更改当前目录为批处理本身的目录
有些晕吧?不急,我举例
比如你有个批处理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 
时间: 2024-08-03 06:34:36

批处理文件的相对路径问题的相关文章

批处理文件指定jre路径启动java桌面应用程序

应用场景: 我开发了一个应用程序,并连同jre一起刻成光盘,提供给用户,用户直接双击批处理文件即可运行,而不需要自己额外装jre. 目录组织结构如下: client |-images |-jre |-lib |-myApp.jar |-appSettings.properties |-start.bat 批处理文件内容.start.bat @echo off set path=%cd%\jre\bin %path%\java.exe -cp myApp.jar 包名称.含入口方法的类名称

批处理获取当前目录的绝对路径

在批处理中使用管理员权限运行的时候系统会认为当前路径是C:\Windows\System32 而使用非管理员权限安装的时候系统会认为当前路径就是批处理文件所在的路径 所以我们最好使用绝对路径去操作文件,以下是绝对路径的获取方式: @echo off echo 当前盘符:%~d0 echo 当前盘符和路径:%~dp0 echo 当前批处理全路径:%~f0 echo 当前盘符和路径的短文件名格式:%~sdp0 echo 当前CMD默认目录:%cd% pause 注意:1.如果路径包括空格最好加上双引

win7操作系统上,批处理文件,直接双击的时候,能运行起来。但是以管理员身份运行的时候,都闪退。请问,这是怎么回事?

问题补充: 批处理中执行的程序与批处理文件在同一个目录中.批处理文件中程序只写了可执行文件名,没有加注其路径. 以管理员身份运行时闪退的原因是,执行批处理中的程序没有找到其路径. 直接双击批处理文件,默认路径是批处理文件所在的路径. 对批处理文件右键以管理员身份运行时,默认路径是c:\windows\system32>

win7批处理运行的默认路径

直接双击批处理文件,默认路径是批处理文件所在的路径. 对批处理文件右键以管理员身份运行时,默认路径是c:\windows\system32> 所以,若批处理文件中的程序与批处理文件在同一路径下,那么直接双击批处理文件就可以顺利运行. 而右键以管理员身份运行时,就会因为找不到程序而提示“...不是内部或外部命令,也不是可运行程序或批处理文件” 要想看到以上的提示信息,需要在批处理文件中写入“pause”,否则批处理文件运行时一闪而过. 运行不成功而且根本看不到任何提示信息.这样会让人摸不着头脑.

关于.Net中Process的使用方法和各种用途汇总(二):用Process启动cmd.exe完成将cs编译成dll

上一章博客我为大家介绍了Process类的所有基本使用方法,这一章博客我来为大家做一个小扩展,来熟悉一下Process类的实际使用,废话不多说我们开始演示. 先看看我们的软件要设计成的布局吧. 首先我们需要给定会使用到的dll,记得vs中的引用那一项吗?我们虽然不需要将这里面的引用全部导入进来,但是我们需要将我们使用过的dll全部导入进来,不然编译时会提示找不到类方法之类的. 可能有些同学不知道怎么查看一个类或者方法所在的dll,其实只用对着那个方法或者类按下f12就能在打开的文档的正上方看到所

DOS批处理中%cd%和%~dp0的区别

在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% 可以用在批处理文件中,也可以用在命令行中: 展开后,是驱动器盘符:+当前目录,如在dos窗口中进入c:\dir目录下面,  www.2cto.com 输入:echo %cd% ,则显示为:c:\dir . %cd%的内容是可以被改变的,其内容为命令的执行路径或批处理文件的执行路径. 2.%~dp0只可以用在批处

批处理学习笔记

echo:表示显示此命令后的字符 echo off:表示不显示在此语句后所有运行的命令都不显示命令行本身 @echo off:当@符号被加在每个命令最前面时,表示运行时不显示这一行的命令行(只能影响当前行). cd /d filePath:要跳转到不同分区(例如从C盘到D盘)的时候,需要添加强制跳转参数 /d :但是,如果进入的是当前目录的子目录,则可以不使用 /d 参数 cd /d %~sdp0:表示进入批处理文件所在的文件夹中.其中,s:表示路径中含有短名:d:表示扩展到批处理文件所在的盘符

dos 批处理中%cd% 和%~dp0的区别

看网上介绍区别,写的好复杂,其实很简单: %cd%  在批处理和命令窗口都能使用.用于打印,当前工作路径. %~dp0% 则只能用于批处理中,用于获得当前批处理文件所在的路径. 做个试验试一下: @echo off echo this is %%cd%% %cd% echo this is %%~dp0 %~dp0 echo switch to another folder: cd d:\Program Files (x86) echo this is %%cd%% %cd% echo this

转载 批处理bat命令--获取当前盘符和当前目录和上级目录

批处理bat命令--获取当前盘符和当前目录和上级目录 批处理命令获取当前盘符和当前目录%~d0 是当前盘符%cd% 是当前目录可以用echo %cd%进行打印测试 以下例子是命令行编译Visual Studio编写的程序:@echo offset b=%cd% //将当前目录保存到参数b中,等号前后不要有空格C:cd program filescd microsoft visual studio cd common cd msdev98cd binmsdev "%b%\test.dsp"