В пакетных файлах, как и в стандартных программах на C, аргумент 0 содержит путь к текущему исполняемому сценарию. Вы можете использовать, %~dp0
чтобы получить только часть пути 0-го аргумента (который является текущим сценарием) - этот путь всегда является полностью определенным путем.
Вы также можете получить полный путь к первому аргументу с помощью %~f1
, но это дает путь в соответствии с текущим рабочим каталогом, что явно не то, что вам нужно.
Лично я часто использую %~dp0%~1
идиому в моем пакетном файле, которая интерпретирует первый аргумент относительно пути исполняемого пакета. Однако у него есть недостаток: он с треском проваливается, если первый аргумент полностью квалифицирован.
Если вам нужно поддерживать как относительные, так и абсолютные пути, вы можете воспользоваться решением Фредерика Менеза : временно изменить текущий рабочий каталог.
Вот пример, который продемонстрирует каждый из этих методов:
@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
Если вы сохраните его как c: \ temp \ example.bat и запустите его из c: \ Users \ Public как
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... вы увидите следующий вывод:
%~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"
документацию для набора модификаторов, разрешенных для аргумента пакета, можно найти здесь:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
для надежной нормализации пути.