Dans les fichiers batch, comme dans les programmes C standard, l'argument 0 contient le chemin du script en cours d'exécution. Vous pouvez utiliser %~dp0
pour obtenir uniquement la partie chemin du 0ème argument (qui est le script actuel) - ce chemin est toujours un chemin complet.
Vous pouvez également obtenir le chemin complet de votre premier argument en utilisant %~f1
, mais cela donne un chemin en fonction du répertoire de travail courant, ce qui n'est évidemment pas ce que vous voulez.
Personnellement, j'utilise souvent l' %~dp0%~1
idiome dans mon fichier batch, qui interprète le premier argument par rapport au chemin du batch en cours d'exécution. Il a cependant un inconvénient: il échoue lamentablement si le premier argument est pleinement qualifié.
Si vous avez besoin de supporter à la fois des chemins relatifs et absolus, vous pouvez utiliser la solution de Frédéric Ménez : changer temporairement le répertoire de travail courant.
Voici un exemple qui illustrera chacune de ces techniques:
@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 vous enregistrez ceci sous c: \ temp \ example.bat et que vous l'exécutez à partir de c: \ Users \ Public sous
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... vous observerez la sortie suivante:
%~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 documentation de l'ensemble des modificateurs autorisés sur un argument batch peut être trouvée ici:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
pour une normalisation robuste des chemins.