![可靠地解析批处理文件的位置](https://linux22.com/image/1472976/%E5%8F%AF%E9%9D%A0%E5%9C%B0%E8%A7%A3%E6%9E%90%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E7%9A%84%E4%BD%8D%E7%BD%AE.png)
获取批处理文件目录的标准构造是使用%~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
是否存在更可靠的替代结构?
当构建工具或其他批处理文件发出命令时,如果名称中包含空格,通常会将可执行文件名称括在双引号中。