Nos arquivos em lote, como nos programas C padrão, o argumento 0 contém o caminho para o script atualmente em execução. Você pode usar %~dp0
para obter apenas a parte do caminho do argumento 0 (que é o script atual) - esse caminho é sempre um caminho totalmente qualificado.
Você também pode obter o caminho completo do seu primeiro argumento usando %~f1
, mas isso fornece um caminho de acordo com o diretório de trabalho atual, que obviamente não é o que você deseja.
Pessoalmente, geralmente uso o %~dp0%~1
idioma no meu arquivo em lotes, que interpreta o primeiro argumento em relação ao caminho do lote em execução. Porém, ele tem uma falha: falha miseravelmente se o primeiro argumento for totalmente qualificado.
Se você precisar oferecer suporte a caminhos relativos e absolutos, poderá usar a solução de Frédéric Ménez : altere temporariamente o diretório de trabalho atual.
Aqui está um exemplo que demonstrará cada uma dessas técnicas:
@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"
rem Temporarily change the current working directory, to retrieve a full path
rem to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd
Se você salvar isso como c: \ temp \ example.bat e executá-lo em c: \ Users \ Public como
c: \ Usuários \ Público> \ temp \ example.bat .. \ windows
... você observará a seguinte saída:
%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"
a documentação para o conjunto de modificadores permitidos em um argumento em lote pode ser encontrada aqui:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
para uma normalização de caminho robusta.