Uma construção padrão para obter o diretório de um arquivo de lote é usar %~dp0
.
No entanto, isso retorna o diretório errado se o nome do arquivo de lote estiver entre aspas duplas.
Por exemplo, o npm gera arquivos cmd em janelas no formato
@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" %*
)
Quando invocado sem aspas, o comando é bem-sucedido conforme esperado.
C:\test> coffee --version
CoffeeScript version 1.10.0
Quando invocado com aspas, o comando falha
C:\test> "coffee" --version
Error: 'C:\test\node_modules\coffee-script\bin\coffee'
O que aconteceu é que %~dp0
avaliou o diretório de trabalho atual C:\test\
em vez do diretório em que o arquivo de lote está.
Existe uma construção alternativa para %~dp0
mais confiável?
Não é incomum que uma ferramenta de construção ou outro arquivo de lote envolva um nome executável entre aspas duplas ao emitir o comando, caso o nome contenha espaços.