Стандартная конструкция для получения каталога командного файла - использовать %~dp0
.
Однако это возвращает неправильный каталог, если имя пакетного файла заключено в двойные кавычки.
Например, npm создает файлы 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
которая более надежна?
При сборке команды инструмент для сборки или другой пакетный файл нередко заключают в двойные кавычки исполняемое имя, если имя содержит пробелы.