W plikach wsadowych, podobnie jak w standardowych programach C, argument 0 zawiera ścieżkę do aktualnie wykonywanego skryptu. Możesz użyć, %~dp0
aby uzyskać tylko część ścieżki zerowego argumentu (który jest bieżącym skryptem) - ta ścieżka jest zawsze w pełni kwalifikowaną ścieżką.
Możesz również uzyskać w pełni kwalifikowaną ścieżkę pierwszego argumentu, używając %~f1
, ale daje to ścieżkę zgodnie z bieżącym katalogiem roboczym, co oczywiście nie jest tym, czego chcesz.
Osobiście często używam %~dp0%~1
idiomu w moim pliku wsadowym, który interpretuje pierwszy argument w stosunku do ścieżki wykonującej partii. Ma jednak wadę: nieszczęśliwie zawodzi, jeśli pierwszy argument jest w pełni kwalifikowany.
Jeśli potrzebujesz obsługiwać zarówno ścieżki względne, jak i bezwzględne, możesz skorzystać z rozwiązania Frédéric Ménez : tymczasowo zmień bieżący katalog roboczy.
Oto przykład, który zademonstruje każdą z tych technik:
@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
Jeśli zapiszesz to jako c: \ temp \ example.bat i uruchomisz go z c: \ Users \ Public jako
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... zobaczysz następujący wynik:
%~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"
dokumentację dotyczącą zestawu modyfikatorów dozwolonych w argumencie wsadowym można znaleźć tutaj:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
do solidnej normalizacji ścieżki.