2

Стандартная конструкция для получения каталога командного файла - использовать %~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 которая более надежна?

При сборке команды инструмент для сборки или другой пакетный файл нередко заключают в двойные кавычки исполняемое имя, если имя содержит пробелы.

0