DOS批处理中%cd%与%~dp0的区别详解
转载:https://www.jb51.net/article/105325.htm
DOS批处理中%cd%与%~dp0的区别详解
假设我们要在批处理a.bat里调用执行批处理b.bat,b.bat需要知道b.bat的当前位置,并执行run.exe,如下:
|
1
2
3
4
5
6
7
8
9
10
|
// directory structure// c:// -a.bat// -program// -b.bat// -run.exe// a.batcall "%cd%\program\b.bat"// b.bat"%cd%\run.exe" |
// 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)。
我们来看看下面的例子:
|
1
2
3
4
5
6
7
8
9
10
11
|
// directory structure// c:// -c.bat// -program// -d.bat// c.batcall "%cd%\program\d.bat"// d.bat@echo offecho cd = %cd%echo dp0 = %~dp0 |
// 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,结果为
|
1
2
|
cd = C:\programdp0 = C:\program\ |
dp0 = C:\program\
直接运行c.bat,结果为
|
1
2
|
cd = C:\dp0 = C:\program\ |
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 ”。那么如何更改呢?
有两种方案:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// plan A// change the current working directory// a.batcd "%~dp0"call "%cd%\program\b.bat"// b.batcd "%~dp0""%cd%\run.exe"// plan B// using %~dp0 directly// a.batcall "%~dp0program\b.bat"// b.bat"%~dp0run.exe" |
// 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通过更改当前目录来解决该问题,可以这里面也存在另外一个问题,让我们看下面的例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// directory structure// c:// -program// -f.bat// d:// -e.bat// plan A// change the current working directory// e.batcd "%~dp0"call "c:\program\f.bat"// f.batcd "%~dp0""%cd%\run.exe" |
// 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是不行的,必须要使用:
|
1
|
cd /d "%~dp0" |
这个地方容易疏忽,切记不要犯错。
问题总结
我们来重申下%~dp0和%cd%的区别, %cd%和%~dp0都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同:
%cd%代表的是当前工作目录(current working directory,variable);%~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。
从目前我们的使用情况来看,尽量使用%~dp0,不建议使用%cd%,有其他需求除外。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
DOS批处理中%cd%与%~dp0的区别详解的更多相关文章
- DOS批处理中%cd%和%~dp0的区别
DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量 ...
- DOS批处理中%cd%和%~dp0的区别[forward]
DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的 ...
- dos 批处理中%cd% 和%~dp0%的区别
看网上介绍区别,写的好复杂,其实很简单: %cd% 在批处理和命令窗口都能使用.用于打印,当前工作路径. %~dp0% 则只能用于批处理中,用于获得当前批处理文件所在的路径. 做个试验试一下: @e ...
- DOS批处理中%cd%和%~dp0的异同分析
在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% 可以用在批处理 ...
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- C#中struct和class的区别详解
本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...
- C#中struct和class的区别详解 (转载)
本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...
- Java中的==和equals的区别详解
1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先 ...
- C#中struct与class的区别详解
转自:http://blog.csdn.net/justlovepro/archive/2007/11/02/1863734.aspx 有这么几点不同: 1.struct 是值类型,class是对象类 ...
随机推荐
- Idea创建maven加载过慢解决方法
添加标签:archetypeCataloginternal问题解决!
- vagrant安装的坑
关于VAGRANT安装过程的坑 标签: 虚拟化 闲来无聊 试试vagrant虚拟化技术 安装过程中坑太多了 所以记录下方便以后 注意: 执行 vagrant up 命令报错 如下 PS F ...
- sublime Text 3安装 Sublime Package Control(这个可以用于安装各种插件)时显示默认安装的c盘内存不够的解决方案
首先先关闭st3 之后在安装的路径下创建Data文件夹,然后打开st3(sublime Text 3简写)CTRL+`打开命令行输入以下内容,直接回车,等待下载完成就可以了import urllib. ...
- 使用开源文档工具docsify,用写博客的姿势写文档
前提 下面的简介摘抄自docsify的官网 https://docsify.js.org 中的简介 docsify是一个神奇的文档网站生成器.他可以快速帮你生成文档网站.不同于GitBook.Hexo ...
- Mysql如何将某个字段的值,在原有的基础上+1?
Eg: 电商项目中,需要统计某件商品的购买数量问题,这时产品提了一个bug,告诉你我需要你做一个购买数量统计?你会怎么做呢? 这里我只说我自己的思路,首先是浏览加购物车,创建订单并支付,mq消息消费后 ...
- 最强 Java 书单推荐,附学习方法
技术大佬用1w+字来告诉你该读什么书,循序渐进,并提供百度云盘下载地址.重要的是还有学习方法. 请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub gi ...
- ASP.NET Core 进程内与进程外的性能对比
ASP.NET Core 进程内与进程外的性能对比 本文内容是<深入去浅出ASP.NET Core>提供的扩展内容,毕竟在书里说进程内外的性能说明对比,对于初学者而言,稍微复杂了点. 我在 ...
- 关于ES6的let、const那些事儿
Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行. let和const命令 let所声明的变量只在let命令所在的代码块内是有效的 ...
- d3力导图绘制节点间多条关系平行线的方法
之前用d3做了多条线之间的绘图是曲线表示的,现在产品要求改成平行线的样式,经过在网上的调研和自己的尝试,实践出一个可用的方法,分享给大家,先展示下结果: 事先声明,本方法是在以下参考网站上进行的结合和 ...
- 万字详解TDengine 2.0整体架构设计思路
导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...