【问题标题】:%~dp0 returns incorrect path [duplicate]%~dp0 返回不正确的路径 [重复]
【发布时间】:2019-10-29 12:59:39
【问题描述】:

我有两个批处理文件。

蝙蝠 1.bat

@echo OFF
setlocal

cd /d "%~dp0"
echo "%~dp0"
cmd /c call "Bat 2.bat"

endlocal
pause

蝙蝠 2.bat

@echo OFF
setlocal

echo "%~dp0"
cd /d "%~dp0..\.."
echo "%~dp0"

endlocal

两个文件都在同一个目录中,所以我希望echo "%~dp0" 每次都输出相同的东西。

但是,在调用cd /d "%~dp0..\.."之后,echo "%~dp0"输出的是当前目录而不是批处理文件所在的目录。为什么输出会改变?


预期

"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"

实际

"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"
"C:\"

【问题讨论】:

  • 去掉引号就可以了,在 bat1.bat call Bat2.bat
  • @jeb 这很奇怪。你知道这是为什么吗?我会修改这个问题,因为我真实场景中的批处理文件中有空格并且名称无法更改
  • 在 SO 或 dostips.com 的某个地方对 %~dp0 进行了长时间的分析(我猜来自 dbenham、Aacini 或可能来自我),但目前我再也找不到它了。但我记得带有%~0 的批处理文件名中或周围的引号的一般问题。也许您应该在更改目录之前存储该值
  • @Stephan 这也很奇怪。但不幸的是,这个批处理文件引用了其他文件,所以我需要%~dp0,因为脚本可能会从其他目录调用。 IE。有人从另一个目录的命令行调用它,或者它以管理员身份运行
  • @jeb 如果这是唯一的解决方案,我会这样做。谢谢

标签: windows batch-file cmd windows-10


【解决方案1】:

您可以使用辅助函数 (:repair) 来解决它。

被调用函数中的%0通常包含函数名(甚至%~0),但如果使用任何修饰符%~<modifier>0,则使用最初的批处理文件名。

bat2.bat的固定版本

@echo OFF
setlocal

echo "%~dp0"
cd /d "%~dp0..\.."
echo current-dir: %__cd__%
echo Wrong value "%~dp0"

call :repair

endlocal
exit /b

:repair
echo ### repair "%~dp0"
exit /b

【讨论】:

  • 感谢您的回答,但 Compo 的评论帮助我找到了解决方案。
【解决方案2】:

感谢 Compo 和来自 MC NDpost

来自 C# 代码

  • 不要使用引号:cmd /c batchfile.cmd

  • 如果需要引号,请在调用批处理文件时使用完整路径。这样 %0 就包含了所有需要的信息。

通过执行cmd /c call "%~dp0Bat 2.bat",批处理文件包含所有需要的信息,并且可以按预期工作。为什么会这样,我不确定,但它解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2015-08-30
    • 2012-09-27
    相关资源
    最近更新 更多