Esta é uma deficiência de design / bug conhecida em cmd.exe - %~dp0
e variantes podem fornecer o resultado errado se o caminho para o script em lote foi citado.
Existe uma solução alternativa. Você pode obter o valor de dentro de uma sub-rotina chamada CALL (note que pelo menos um modificador como ~d
, ~f
etc. deve ser usado, senão você pega a sub-rotina :label
)
@echo off
setlocal
pushd %~dp0
echo From main fails: "%~dp0"
call :test
popd
exit /b
:test
echo From subroutine OK: "%~dp0"
- SAÍDA DE AMOSTRA -
d:\dir>"my files\test.bat"
From main fails: "d:\dir\my files\my files\"
From subroutine OK: "d:\dir\my files\"