En los archivos por lotes, como en los programas C estándar, el argumento 0 contiene la ruta al script que se está ejecutando actualmente. Puede usar %~dp0
para obtener solo la parte de ruta del argumento 0 (que es el script actual): esta ruta siempre es una ruta totalmente calificada.
También puede obtener la ruta totalmente calificada de su primer argumento utilizando %~f1
, pero esto proporciona una ruta de acuerdo con el directorio de trabajo actual, que obviamente no es lo que desea.
Personalmente, a menudo uso el %~dp0%~1
idioma en mi archivo por lotes, que interpreta el primer argumento relativo a la ruta del lote en ejecución. Sin embargo, tiene una deficiencia: falla miserablemente si el primer argumento está completamente calificado.
Si necesita admitir rutas relativas y absolutas, puede utilizar la solución de Frédéric Ménez : cambiar temporalmente el directorio de trabajo actual.
Aquí hay un ejemplo que demostrará cada una de estas 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
Si guarda esto como c: \ temp \ example.bat y lo ejecuta desde c: \ Users \ Public como
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... observará el siguiente resultado:
%~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"
la documentación para el conjunto de modificadores permitidos en un argumento por lotes se puede encontrar aquí:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
para una normalización de ruta sólida.