获取批处理文件目录的标准构造是使用%~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
是否存在更可靠的替代结构?
当构建工具或其他批处理文件发出命令时,如果名称中包含空格,通常会将可执行文件名称括在双引号中。