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

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

获取批处理文件目录的标准构造是使用%~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是否存在更可靠的替代结构?

当构建工具或其他批处理文件发出命令时,如果名称中包含空格,通常会将可执行文件名称括在双引号中。

相关内容