Windows下批处理中%cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同。下面这篇文章就来给大家详细介绍了DOS批处理中%cd%与%~dp0的区别,需要的朋友可以参考借鉴。

问题描述

假设我们要在批处理a.bat里调用执行批处理b.bat,b.bat需要知道b.bat的当前位置,并执行run.exe,如下:

// directory structure

// c:

// -a.bat

// -program

// -b.bat

// -run.exe

// a.bat

call "%cd%\program\b.bat"

// b.bat

"%cd%\run.exe"

那么现在能不能成功执行run.exe呢?

问题分析

%cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同:%cd%代表的是当前工作目录(current working directory,variable);

%~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。

我们来看看下面的例子:

// directory structure

// c:

// -c.bat

// -program

// -d.bat

// c.bat

call "%cd%\program\d.bat"

// d.bat

@echo off

echo cd = %cd%

echo dp0 = %~dp0

直接运行d.bat,结果为

cd = C:\program

dp0 = C:\program\

直接运行c.bat,结果为

cd = C:\

dp0 = C:\program\

从上面的结果可以看出:执行d.bat时,当前工作目录为d.bat所在目录;

执行c.bat时,当前工作目录为c.bat所在目录,即使在调用d.bat后,该工作目录依旧是c.bat所在目录。

问题解决

让我们再来看看问题描述中提及的问题——能不能成功执行run.exe呢?

答案是:不能。“ %cd%\run.exe ”表示的是“ C:\run.exe ”,并非“ C:\program\run.exe ”。那么如何更改呢?

有两种方案:

// plan A

// change the current working directory

// a.bat

cd "%~dp0"

call "%cd%\program\b.bat"

// b.bat

cd "%~dp0"

"%cd%\run.exe"

// plan B

// using %~dp0 directly

// a.bat

call "%~dp0program\b.bat"

// b.bat

"%~dp0run.exe"

问题延伸

上面的解决方案中plan A通过更改当前目录来解决该问题,可以这里面也存在另外一个问题,让我们看下面的例子:

// directory structure

// c:

// -program

// -f.bat

// d:

// -e.bat

// plan A

// change the current working directory

// e.bat

cd "%~dp0"

call "c:\program\f.bat"

// f.bat

cd "%~dp0"

"%cd%\run.exe"

现在e.bat和f.bat不在同一个盘符了,从e.bat切换当前工作目录到f.bat直接使用cd是不行的,必须要使用:

cd /d "%~dp0"

这个地方容易疏忽,切记不要犯错。

问题总结

我们来重申下%~dp0和%cd%的区别,%cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同:%cd%代表的是当前工作目录(current working directory,variable);

%~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。

从目前我们的使用情况来看,尽量使用%~dp0,不建议使用%cd%,有其他需求除外。

更多DOS批处理中%cd%与%~dp0的区别详解相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php dp0,DOS批处理中%cd%与%~dp0的区别详解相关推荐

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

    DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.   这两个变量的用法和代表 ...

  2. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

  3. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  4. python request.post 字典参数以json_Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  5. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  6. PHP中include和require的区别详解

    PHP中include和require的区别详解 1.概要  require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每 ...

  7. python post json参数,Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  8. python中average什么意思_在Python3 numpy中mean和average的区别详解

    mean和average都是计算均值的函数,在不指定权重的时候average和mean是一样的.指定权重后,average可以计算一维的加权平均值. 具体如下: import numpy as np ...

  9. java里throws详细讲解,基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  10. C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

最新文章

  1. 函数 php_PHP函数缺陷详解
  2. 06/05/2015
  3. 在PyCharm中设置新建Python文件的模板格式方法
  4. SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师
  5. Jzoj4891 摆书
  6. 如何处理SAP Fiori Launchpad错误消息:Could not start the app due to a configuration problem
  7. html禁用自动完成,html – 如何禁用所有主流浏览器的自动完成功能
  8. python逐行读取数据时出现错误_Python利用逐行读取readline()打印出现空行的解决办法...
  9. 高流量站点NGINX与PHP-fpm配置优化
  10. 解决远程服务器ssh登陆慢等问题
  11. paip.一千 常用汉字 高频汉字 覆盖率90%
  12. 史上最完整基于Springboot实现进销存管理系统
  13. 微信公众号跳转微信小程序,自定义微信跳转标签
  14. java记忆翻牌_html5记忆翻牌游戏
  15. 乒乓球侧旋球MATLAB,【动图】看动图让你了解乒乓球的侧旋转
  16. esp32 Flash分区与OTA功能简析
  17. Win10多用户同时远程桌面的另类解决方案---支持1809和1909和2004版本V2.0
  18. A代表数字1,B代表数字2,以此类推Z代表26
  19. Deep Learning Exercise: Linear Regression
  20. 分布式存储技术及应用

热门文章

  1. 数据结构经典问题——出栈顺序 转载至:canlynet微博
  2. 搭建一个wordpress
  3. ocp007 题库解析(1-15)
  4. Redhat linux 5 Server相关介绍
  5. 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程...
  6. Dubbo分析之Registry层
  7. eBay把平台更新为Kubernetes、Envoy和Kafka:计划开源硬件和软件
  8. UrlRewriter配置IIS支持伪静态
  9. 幸福框架:可扩展的、动态的、万能的 编号生成器
  10. YV12数据与AVFrame的相互转换