zoukankan      html  css  js  c++  java
  • DOS批处理中%cd%与%~dp0的区别详解

    转载:https://www.jb51.net/article/105325.htm

    DOS批处理中%cd%与%~dp0的区别详解

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

    假设我们要在批处理a.bat里调用执行批处理b.batb.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.bat
    call "%cd%program.bat"
    // b.bat
    "%cd% un.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.bat
    call "%cd%programd.bat"
    // d.bat
    @echo off
    echo cd = %cd%
    echo dp0 = %~dp0

    直接运行d.bat,结果为

    1
    2
    cd = C:program
    dp0 = C:program

    直接运行c.bat,结果为

    1
    2
    cd = C:
    dp0 = C:program

    从上面的结果可以看出:

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

    问题解决

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

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

    有两种方案:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // plan A
    // change the current working directory
    // a.bat
    cd "%~dp0"
    call "%cd%program.bat"
    // b.bat
    cd "%~dp0"
    "%cd% un.exe"
    // plan B
    // using %~dp0 directly
    // a.bat
    call "%~dp0program.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.bat
    cd "%~dp0"
    call "c:programf.bat"
    // f.bat
    cd "%~dp0"
    "%cd% un.exe"

    现在e.batf.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%,有其他需求除外。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

  • 相关阅读:
    Java学习第七周汇报
    Java暑期学习第四十三天日报
    Java暑期学习第四十七天日报
    Java学习第六周汇报
    SQL server数据库优化
    c#在WinForm中重写ProgressBar控件(带%的显示)
    javascript事件处理在IE和FireFox中的区别
    c# winform 关于DataGridView的一些操作
    JavaScript验证中文,特殊字符
    VB.NET与C#.NET比较
  • 原文地址:https://www.cnblogs.com/MCSFX/p/12799531.html
Copyright © 2011-2022 走看看