可靠地解析批处理文件的位置


2

使用获取批处理文件目录的标准构造%~dp0

但是,如果批处理文件的名称用双引号引起来,则会返回错误的目录。

例如,npm在Windows中以以下格式生成cmd文件

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\coffee-script\bin\coffee" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\node_modules\coffee-script\bin\coffee" %*
)

当不带引号调用时,命令将按预期成功执行。

C:\test> coffee --version
CoffeeScript version 1.10.0

当用引号调用时,命令失败

C:\test> "coffee" --version
Error: 'C:\test\node_modules\coffee-script\bin\coffee'

发生的事情%~dp0已经评估到当前的工作目录,C:\test\而不是批处理文件所在的目录。

有没有一种%~dp0更可靠的替代构造?

生成工具或其他批处理文件在发出命令时将可执行文件的名称括在双引号中的情况很常见,以防该名称包含空格。


2
默认并遵守此行为。阅读的答案和讨论相关问题(不完全名单!):CMD:%的失败〜D0当受理报价批处理文件的名称,并在批处理文件〜关于更改目录DP0变化等等,等等
JosefZ

解决了吗?
马克·德文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.