Resolve com fiabilidade a localização de um ficheiro batch

2

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.

    
por Chris Chilvers 10.11.2015 / 15:05

0 respostas